c - GDB:对于不同硬件平台上的每个程序,函数地址是固定的还是动态的?
问题描述
如果我们编写类似的 C 代码printf("%p\n", __builtin_return_address(0));
并假设我们0xabcd
从客户的平台获得结果。然后,我们在我们的平台上用 gdb 运行相同的程序,我们发现0xabcd
映射到sample_function()
,当他运行该程序时,在客户的平台上是否有相同的功能?或者换句话说,对于同一程序但不同硬件平台的堆栈地址是固定的还是动态的?
解决方案
为了防止某些攻击,例如缓冲区溢出,操作系统使用地址空间布局随机化(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
推荐阅读
- objective-c - 将 Objective-C 类存储在数组中并使用它们
- python - 如何根据 id 和 value 将序列号放入我的重复值中
- jquery - jquery.contextMenu ajax提交后无法读取属性
- graphql - 在graphql.js中调用graphql方法的requestString参数是什么?
- sparql - 如何“旋转” SPARQL 导致“循环”?
- simulation - Anylogic变量未更新
- css - jQuery UI 可排序:防止在全高列之间使用连接列表进行水平滚动
- python - 根据另一个列表中的属性对对象列表进行排序
- c# - 如何创建包含两个 DateTime 对象之间的日期的字符串数组或列表?
- android - 为什么 Android 上的阴影会被其他组件覆盖?