当我发现一些奇怪的东西时,我正在玩一些代码:
[~] 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地址的变化。
我的猜测是内核提供了不同的堆栈起始地址来尝试阻止某种破解。真正的原因是什么?
正是由于这个原因,在多个操作系统上使用了地址空间布局随机化。堆栈指针地址的变化很可能是由这种情况引起的- 在最新版本的Linux和/或* BSD上很可能是这种情况。IIRC Windows的最新版本也可以做到这一点。