2

我用windbg在我的Windows 10机器上运行一个程序,让它在初始断点处中断。我取堆栈物理底部的地址(TEB 的 stackBase),然后减去rsp. ntdll!LdrInitializeThunk我只是在同一个程序上做了 5 次,得到了 5 个不同的值:

0x600
0x9f0
0xa40
0x5d0
0x570

如果你对ntdll!RtlUserThreadStart等做同样的事情,你会得到类似的结果。这表明堆栈的“逻辑底部”有些随机化。这是为什么?这是堆栈内部的某种“迷你ASLR”吗?这在任何地方都有记录吗?

4

1 回答 1

1

在专门搜索了 Vista 中的 ASLR(在 Vista 中引入了 ASLR)之后,我从 Symantec找到了这个文档。在第 5 页,它提到了我的问题所涉及的现象(强调我的):

一旦堆栈被放置,初始堆栈指针将进一步随机减少一个随机递减量。初始偏移量选择为最多半页(2,048 字节),但仅限于自然对齐的地址 [...]

因此,出于安全原因,它似乎是故意这样做的(这样就更难找出驻留在相对于堆栈基础的固定偏移量的事物的地址)。

我将这个问题留待一段时间,希望有人可以提供更有见地的答案。如果没有人这样做,我会接受这个答案。

于 2016-07-06T09:50:41.743 回答