为什么执行同一个程序每次输出的变量地址是不一样的

首先看一下下面的代码

#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
提示:可能你试验的结果和我并不一致,因为地址空间随机化,需要操作系统和程序自身的双重支持
在这里,我并没有详细介绍地址空间随机化,一方面是我理解的有限,写一写也只是泛泛而谈;其次,我觉得这就是一篇科普性质的文章,能让你们知道有这个机制就可以了……

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值