为什么同一二进制程序的每次执行中,局部变量的地址都会不断改变?

3
我有一个小代码片段如下:
```html

我有一个小代码片段如下:

```
char global=100;        

void main()
{
            char p = NULL;
            printf("%p\n", &p);
            printf("%p\n", &global);
}

编译并生成二进制可执行文件后,每次运行同一个二进制可执行文件时,我发现本地变量 p 的虚拟内存地址是不同的
然而,全局变量 global 的虚拟内存地址保持不变。 我了解 C 语言的内存布局,并期望给定变量在使用相同的二进制映像进行每次执行时都具有相同的内存位置。

为什么本地变量在运行时被分配的虚拟地址会不同呢?
只有一个函数,没有机会更改函数执行顺序,因此也不能更改堆栈内存布局。

这个程序运行 4 次的结果:

0x7fff181b4b2f
0x601034

0x7ffe34abd62f
0x601034

0x7ffe2813b98f
0x601034

0x7fffcef6b52f
0x601034

地址空间布局随机化(ASLR)是否相关? - Joshua Taylor
尝试临时禁用ASLR: echo 0 | sudo tee /proc/sys/kernel/randomize_va_space - Francesco Laurita
1个回答

5
这通常是由地址空间布局随机化引起的。这是一种安全技术,旨在防止某些类型的攻击,例如缓冲区溢出
托管环境中的局部变量通常存储在堆栈上。在这种情况下,堆栈的虚拟内存地址会发生变化,以便试图越界缓冲区并运行任意代码的人无法预测恶意代码将出现的地址。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接