【发布时间】:2016-08-07 20:08:06
【问题描述】:
我检查了是否启用了 ASLR,如下所示,我认为是:
[user@localhost test]$ cat /proc/sys/kernel/randomize_va_space
2
我尝试使用以下程序对其进行测试:
test.c:
#include <stdio.h>
int main(void)
{
printf("%p\n", main);
return 1;
}
我预计,如果 ASLR 处于活动状态,每次运行都会到不同的地址,对吧?但我每次都一样。我测试了 64 位和 32 位可执行文件。我正在使用 64 位 Arch Linux 系统进行测试:
[user@localhost test]$ gcc test.c -o test
[user@localhost test]$ ./test
0x4004c6
[user@localhost test]$ ./test
0x4004c6
[user@localhost test]$ ./test
0x4004c6
[user@localhost test]$ ./test
0x4004c6
[user@localhost test]$ gcc -m32 test.c -o test
[user@localhost test]$ ./test
0x80483eb
[user@localhost test]$ ./test
0x80483eb
[user@localhost test]$ ./test
0x80483eb
[user@localhost test]$ ./test
0x80483eb
如您所见,每次运行的地址都是相同的。这不是说ASLR关闭了吗?
【问题讨论】:
-
尝试获取变量的地址,而不是非静态函数
-
顺便说一句,将非
void*传递给printf中的 '%p' 参数是未定义的行为 -
@Elazar 为什么?
.text部分中的函数应该受 ASLR 影响,不是吗?这难道不是 ASLR 最基本的用途——随机化可执行部分吗? -
最基本的层次是栈指针
-
尽管对奇怪的哈佛架构目标给予了应有的尊重,但函数指针问题显然与提出的问题无关。