【问题标题】:Why does the address of a local variable keeps changing during every execution of the same binary image?为什么每次执行同一个二进制图像时局部变量的地址都会不断变化?
【发布时间】:2018-01-20 19:11:15
【问题描述】:

我有如下小代码sn-p:

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

【问题讨论】:

标签: c memory-layout addressing


【解决方案1】:

这通常是由address space layout randomization 引起的。这是一种安全技术,旨在防止某些类型的攻击,例如 buffer overflow

托管环境中的局部变量通常存储在堆栈中。在这种情况下,堆栈的虚拟内存地址会发生变化,因此试图溢出缓冲区并运行任意代码的人将无法预测恶意代码将出现的地址。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多