Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么ASLR似乎不起作用_C_Linux_Aslr - Fatal编程技术网

C 为什么ASLR似乎不起作用

C 为什么ASLR似乎不起作用,c,linux,aslr,C,Linux,Aslr,我检查了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已关闭吗?您的可执行文件必须是位置独立的,才能允许此操作

我检查了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已关闭吗?

您的可执行文件必须是位置独立的,才能允许此操作

gcc -pie -fPIE -o test test.c
尝试以这种方式运行,地址在每次运行时都会明显更改

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

在任何其他地址加载非PI可执行文件会使所有这些绝对引用失效,最好的结果是SIGSEGV,最坏的结果是一些随机代码运行。无法安全地随机化
main
的地址,因为允许编译器假定它不会随机化,因此即使启用了ASLR,也不会随机化

为了允许随机化,必须告诉编译器生成位置独立的代码(
-fPIE
),并且生成的可执行文件必须标记为位置独立(
-pie
),以便内核知道在任何地址加载都是安全的


实现这一点所需的选项在很大程度上取决于工具链配置,
-fpie
-fpie
-fpic
-fpic
,有些默认情况下可能会生成PI代码。安全的方法是使用
-fPIE
编译并链接
-pie-fPIE

尝试获取变量的地址,而不是非静态函数。将非
void*
传递给
printf
中的“%p”参数是未定义的behavior@Elazar为什么?
.text
部分中的函数应受到ASLR的影响,是否?这难道不是ASLR最基本的目的吗?将可执行部分随机化?最基本的层次是堆栈指针。在充分考虑哈佛体系结构目标的情况下,函数指针问题显然与提出的问题无关。谢谢。在接受之前,我花了一些时间研究了-pie和-fpie,但是如果你简单地解释一下它们的作用或者为什么与ASLR有关,可能会对其他人有所帮助。更新了这篇文章,希望它现在足够独立,不需要太多谷歌搜索就可以阅读。相关:有更多关于pie可执行文件的信息。
gcc -pie -fPIE -o test test.c