gpt4 book ai didi

c - 为什么 ASLR 似乎不起作用

转载 作者:太空狗 更新时间:2023-10-29 11:28:52 26 4
gpt4 key购买 nike

我检查了 ASLR 是否启用如下,我认为它是:

[user@localhost test]$ cat /proc/sys/kernel/randomize_va_space
2

我尝试使用以下程序对其进行测试:

测试.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 已关闭?

最佳答案

您的可执行文件必须与位置无关才能允许这样做。

gcc -pie -fPIE -o test test.c

尝试以这种方式运行它,地址应该在每次运行时明显改变。

非 PI 可执行文件旨在加载到存储在其 ELF header 中的固定、显式非随机地址。这种假设允许编译器和链接器将绝对地址硬编码到输出中,使其在某些目标上更小更快。

在任何其他地址加载非 PI 可执行文件会使所有这些绝对引用无效,导致最好的 SIGSEGV 和最坏的运行一些随机代码。 main 的地址不能被安全地随机化,因为允许编译器假定它不会被随机化,所以即使启用了 ASLR,它也永远不会完成。

要允许随机化,必须告知编译器生成与位置无关的代码 (-fPIE),并且生成的可执行文件必须标记为与位置无关的 (-pie >) 这样内核就会知道在任何地址加载都是安全的。

需要哪些选项来实现这在很大程度上取决于工具链配置,-fpie-fPIE-fpic -fPIC,有些可能会默认生成PI代码。安全的做法是使用 -fPIE 进行编译并使用 -pie -fPIE 进行链接。

关于c - 为什么 ASLR 似乎不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38818084/

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