gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 00:54:53 27 4
gpt4 key购买 nike

为了理解 ASLR,我构建了这个简单的程序:

#include <stdio.h>
#include <stdlib.h>

int main() {
printf("%p\n", &system);
return 0;
}

ALSR 似乎已启用:

$ cat /proc/sys/kernel/randomize_va_space
2

我用 GCC 编译程序:

$ gcc aslrtest.c

每次我运行这个程序时,它都会打印相同的地址 (0x400450)。

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

我期望 system() 的地址应该是随机的,我错了吗?还是我的配置有问题?

最佳答案

从主程序中的非位置独立目标文件生成的共享库中对函数的任何引用都需要一个 PLT 条目,调用者可以通过该条目通过解析为固定地址的调用指令进行调用链接时间。这是因为目标文件不是用特殊代码 (PIC) 构建的,以使其支持在可变地址调用函数。

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

如果你真的想获得 ASLR 的好处来对抗使用已知固定地址调用函数的攻击,你需要将主程序构建为 PIE。

关于c - 为什么在启用 ASLR 时 glibc 的函数地址不随机化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24984955/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com