首先看一下下面的代码
#include<stdio.h>
int main()
{
int a = 1;
printf("%p\n", &a);
return 0;
}
然后我就很疑惑,为什么每次的地址都是不一样的。
为什么会有这样的疑问呢,编译完成后得到的文件叫做可重定位目标文件,链接的过程就是主要就是地址空间分配,符号决议和重定位。那么,按照这样的逻辑推断,gcc test1.c
后得到可执行文件确定后,相应的变量的地址空间也就确定了,那么为什么输出的地址却不一样????
后来再和同学的讨论过程中得知了,地址空间随机化分布
切换到root权限后执行 echo 0 >/proc/sys/kernel/randomize_va_space
然后运行a.out文件,可以看出每次输出的结果都是一样的
实验结束,记得一定要 echo 2 >/proc/sys/kernel/randomize_va_space
,打开地址空间随机化的开关,这是为了防止对抗缓冲区溢出的攻击。
实验环境: 4.15.0-29deepin-generic x86_64 GNU/Linux gcc version 7.3.0
提示:可能你试验的结果和我并不一致,因为地址空间随机化,需要操作系统和程序自身的双重支持
在这里,我并没有详细介绍地址空间随机化,一方面是我理解的有限,写一写也只是泛泛而谈;其次,我觉得这就是一篇科普性质的文章,能让你们知道有这个机制就可以了……