加入收藏 | 设为首页 | 会员中心 | 我要投稿 云计算网_泰州站长网 (http://www.0523zz.com/)- 视觉智能、AI应用、CDN、行业物联网、智能数字人!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

为什么在启用ASLR时glibc的函数地址不是随机的?

发布时间:2021-01-15 05:25:47 所属栏目:Linux 来源:网络整理
导读:在尝试理解ASLR时,我构建了这个简单的程序: #include 似乎启用了ALSR: $cat /proc/sys/kernel/randomize_va_space2 我使用GCC编译程序: $gcc aslrtest.c 每次运行此程序时,它都会打印相同的地址(0x400450). 如果glibc在随机地址加载,我希望这个程序每次

在尝试理解ASLR时,我构建了这个简单的程序:

#include 

似乎启用了ALSR:

$cat /proc/sys/kernel/randomize_va_space
2

我使用GCC编译程序:

$gcc aslrtest.c

每次运行此程序时,它都会打印相同的地址(0x400450).

如果glibc在随机地址加载,我希望这个程序每次打印一个不同的地址.这对我来说是令人惊讶的,特别是考虑到防止返回libc攻击应该是ASLR(特别是system()调用)的主要动机.

我期望system()的地址应该是随机的吗?或者我的配置可能有问题?

最佳答案 从主程序中的非位置无关的目标文件对共享库中的函数的任何引用都需要PLT条目,调用者可以通过该条目通过在链接时解析为固定地址的调用指令进行调用. .这是因为目标文件没有使用特殊代码(PIC)构建,以使其能够支持在变量地址处调用函数.

每当这样的PLT条目用于库中的函数时,该PLT条目的地址,而不是函数的原始地址,就成为其“官方”地址(如在您打印系统地址的示例中).这是必要的,因为必须以相同的方式从C程序的所有部分看到函数的地址.系统地址的语言不允许根据程序的哪个部分来查看它,因为这会破坏两个指向同一函数的指针相等的规则.

如果您真的希望从使用已知固定地址调用函数的攻击中获得ASLR的好处,则需要将主程序构建为PIE.

(编辑:云计算网_泰州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读