C 为什么在每次执行同一个二进制映像时,局部变量的地址都会不断变化?
我有如下小代码段:C 为什么在每次执行同一个二进制映像时,局部变量的地址都会不断变化?,c,memory-layout,addressing,C,Memory Layout,Addressing,我有如下小代码段: char global=100; void main() { char p = NULL; printf("%p\n", &p); printf("%p\n", &global); } 编译并生成二进制可执行文件映像后,在每次执行相同的二进制可执行文件时,我看到本地变量p的虚拟内存地址不同 但是,全局变量global的虚拟内存地址保持不变。 我了解C内存布局;我希望在每
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:
echo 0 | sudo tee/proc/sys/kernel/randomize\u va_space