Linux 中的内存随机化

7_R*_*R3X 4 memory stack aslr

我创建了一个简单的 C 程序,每次在 GDB 中加载它时,我都会看到分配给程序指令的相同内存地址。例如,一个函数what()总是在内存位置 0x000055555555472d 加载。实际上,每次执行的堆栈都完全相同(不仅是堆栈的内容,还包括 rsp 指向的内存地址。

我知道可以通过将“/proc/sys/kernel/randomize_va_space”设置为 0 在 Linux 中禁用 ASLR,但我的 Debian 系统中的值为 2。

root@Sierra ~ % cat /proc/sys/kernel/randomize_va_space 
2
Run Code Online (Sandbox Code Playgroud)

根据我对 ASLR 的理解,这些地址应该在每次运行时随机化。我的问题是为什么会发生这种情况?我做错了什么吗?

Mar*_*ick 6

默认情况下,gdb 在 Linux 上禁用地址空间随机化,覆盖kernel.randomize_va_spacesysctl 变量可能具有的任何值。

gdb 命令set disable-randomization off将关闭此功能,之后由 gdb 创建的任何调试目标将根据 的值打开或关闭 ASLR kernel.randomize_va_space