首页 > 解决方案 > GDB:对于不同硬件平台上的每个程序,函数地址是固定的还是动态的?

问题描述

如果我们编写类似的 C 代码printf("%p\n", __builtin_return_address(0));并假设我们0xabcd 从客户的平台获得结果。然后,我们在我们的平台上用 gdb 运行相同的程序,我们发现0xabcd映射到sample_function(),当他运行该程序时,在客户的平台上是否有相同的功能?或者换句话说,对于同一程序但不同硬件平台的堆栈地址是固定的还是动态的?

标签: cdebugginggdbremote-debugginggdbserver

解决方案


为了防止某些攻击,例如缓冲区溢出,操作系统使用地址空间布局随机化(ASLR)。ASLR 确保每次运行程序时,地址将随机放置在虚拟地址空间中。在 Linux 上,它默认启用。您可以通过运行禁用它

echo 0 | sudo tee /proc/sys/kernel/randomize_va_space

然后,如果您想再次启用它,只需运行

echo 2 | sudo tee /proc/sys/kernel/randomize_va_space

有关更多信息,您可以查看这篇文章ASLR 在 Linux 系统上的效果如何?

另一方面,为了方便调试,gdb 默认禁用 ASLR。您可以使用这些命令启用/禁用它

set disable-randomization off
set disable-randomization on

推荐阅读