为什么在启用ASLR时glibc的函数地址不是随机的?
在试图理解ASLR时,我建立了这个简单的程序:
#include <stdio.h>
#include <stdlib.h>
int main() {
printf("%pn", &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条目的地址(而不是该功能的原始地址)就成为其“官方”地址(就像你打印system
地址的例子一样)。 这是必要的,因为函数的地址必须以与C程序的所有部分相同的方式来看待; system
地址的语言不允许根据程序的哪一部分查看它而改变,因为这会破坏两个指向同一函数的指针相等的规则。
如果您真的想从ASLR中获得利用已知固定地址调用函数的攻击的好处,则需要将主程序构建为PIE。
实际上printf("%pn", &system);
不会打印libc地址,它实际上会打印system@plt
地址,而不是由ASLR随机化
但它确实随机化了最终保护ret2libc攻击的libc地址!
链接地址: http://www.djcxy.com/p/62199.html上一篇: Why aren't glibc's function addresses randomized when ASLR is enabled?