Linux下的伪随机堆栈指针?

Ric*_*ton 8 linux stack

当我注意到一些奇怪的东西时,我正在玩一些代码:

[~] main% cat test.cc
#include <stdio.h>

void f()
{
    int i;
    fprintf(stderr, "&i = 0x%08X\n", (long)&i);
}

int main(int argc, char**argv)
{
    f();
}
[~] main% g++ test.cc
[~] main% ./a.out
&i = 0xBFA27AB4
[~] main% ./a.out
&i = 0xBFAD7E24
[~] main% ./a.out
&i = 0xBFCA3464
[~] main% ./a.out
&i = 0xBF96C064
[~] main%
Run Code Online (Sandbox Code Playgroud)

对我来说奇怪的是变量i的地址变化.

我的猜测是内核提供不同的堆栈起始地址以试图阻止某种破解.真正的原因是什么?

Con*_*lls 13

出于这个原因,地址空间布局随机化在几个操作系统上使用.堆栈指针地址的变化可能是由此引起的 - 很可能是最近版本的Linux和/或*BSD的情况.IIRC最新版本的Windows也可以这样做.

  • 如果要在禁用ASLR的情况下进行测试,可以使用`echo 0>/proc/sys/kernel/randomize_va_space`(当然是root用户)来进行测试. (6认同)