为什么在每次执行同一个二进制图像时,局部变量的地址都会不断变化?
Why does the address of a local variable keeps changing during every execution of the same binary image?
我有如下小代码片段:
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
这通常是由 address space layout randomization. It's a security technique meant to prevent certain types of attacks such as a buffer overflow 引起的。
托管环境中的局部变量通常存储在堆栈中。在这种情况下,堆栈的虚拟内存地址发生变化,因此有人试图越过 运行 缓冲区和 运行 任意代码将无法预测恶意代码将出现的地址。
我有如下小代码片段:
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
这通常是由 address space layout randomization. It's a security technique meant to prevent certain types of attacks such as a buffer overflow 引起的。
托管环境中的局部变量通常存储在堆栈中。在这种情况下,堆栈的虚拟内存地址发生变化,因此有人试图越过 运行 缓冲区和 运行 任意代码将无法预测恶意代码将出现的地址。