GDB:对于不同硬件平台上的每个程序,函数地址是固定的还是动态的?
GDB: Is function address fixed or dynamic for every program on different hardware platform?
如果我们编写像 printf("%p\n", __builtin_return_address(0));
这样的 C 代码,假设我们从客户的平台 得到结果 0xabcd
。然后,我们 运行 在我们的平台上 与 gdb 相同的程序,我们发现 0xabcd
映射到 sample_function()
,这是同一个函数当他 运行 执行该程序时在客户的平台上?或者换句话说,对于同一个程序但不同的硬件平台,堆栈地址是固定的还是动态的?
为了防止某些攻击,例如缓冲区溢出,操作系统使用地址Space布局随机化(ASLR)。 ASLR 确保每次您 运行 一个程序时,地址将随机放置在虚拟地址 space 上。
在 Linux,它默认启用。您可以通过 运行ning
禁用它
echo 0 | sudo tee /proc/sys/kernel/randomize_va_space
然后,如果您想再次启用它,只需 运行
echo 2 | sudo tee /proc/sys/kernel/randomize_va_space
更多信息可以查看这篇文章How Effective is ASLR on Linux Systems?
另一方面,在 gdb 中默认禁用 ASLR 以简化调试。您可以 enable/disable 使用这些命令
set disable-randomization off
set disable-randomization on
如果我们编写像 printf("%p\n", __builtin_return_address(0));
这样的 C 代码,假设我们从客户的平台 得到结果 0xabcd
。然后,我们 运行 在我们的平台上 与 gdb 相同的程序,我们发现 0xabcd
映射到 sample_function()
,这是同一个函数当他 运行 执行该程序时在客户的平台上?或者换句话说,对于同一个程序但不同的硬件平台,堆栈地址是固定的还是动态的?
为了防止某些攻击,例如缓冲区溢出,操作系统使用地址Space布局随机化(ASLR)。 ASLR 确保每次您 运行 一个程序时,地址将随机放置在虚拟地址 space 上。 在 Linux,它默认启用。您可以通过 运行ning
禁用它echo 0 | sudo tee /proc/sys/kernel/randomize_va_space
然后,如果您想再次启用它,只需 运行
echo 2 | sudo tee /proc/sys/kernel/randomize_va_space
更多信息可以查看这篇文章How Effective is ASLR on Linux Systems?
另一方面,在 gdb 中默认禁用 ASLR 以简化调试。您可以 enable/disable 使用这些命令
set disable-randomization off
set disable-randomization on