一尘不染

Linux下的伪随机堆栈指针?

linux

当我发现一些奇怪的东西时,我正在玩一些代码:

[~] 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%

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

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


阅读 237

收藏
2020-06-07

共1个答案

一尘不染

正是由于这个原因,在多个操作系统上使用了地址空间布局随机化。堆栈指针地址的变化很可能是由这种情况引起的-
在最新版本的Linux和/或* BSD上很可能是这种情况。IIRC Windows的最新版本也可以做到这一点。

2020-06-07