Windows 为什么“补偿”是;逻辑底部“;及;“实际底部”;堆栈的随机性?

Windows 为什么“补偿”是;逻辑底部“;及;“实际底部”;堆栈的随机性?,windows,aslr,windows-nt,Windows,Aslr,Windows Nt,我用windbg在我的Windows 10机器上运行一个程序,并让它在初始断点中断。我获取堆栈物理底部的地址(TEB的stackBase),然后减去ntdll的rsp值!LdrInitializeThunk。我在同一个程序上做了5次,得到了5个不同的值: 0x600 0x9f0 0xa40 0x5d0 0x570 如果对ntdll执行相同操作,则会得到类似的结果!RtlUserThreadStart,等等。这表明堆栈的“逻辑底部”在某种程度上是随机的。为什么呢?这是堆栈内部的某种“迷你ASLR

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

0x600
0x9f0
0xa40
0x5d0
0x570

如果对
ntdll执行相同操作,则会得到类似的结果!RtlUserThreadStart
,等等。这表明堆栈的“逻辑底部”在某种程度上是随机的。为什么呢?这是堆栈内部的某种“迷你ASLR”吗?这在任何地方都有记录吗?

在谷歌上搜索了Vista中的ASLR(ASLR是在Vista中引入的),我从Symantec找到了。在第5页,它提到了我的问题所涉及的现象(强调我的问题):

放置堆栈后,初始堆栈指针将通过随机递减进一步随机化 数量初始偏移量选择为最多半页(2048字节),但限制为 对齐地址[…]

因此,出于安全原因,这似乎是有意的(这样就很难找出位于相对于堆栈基的固定偏移量处的对象的地址)


我把这个问题留了一段时间,希望有人能提供一个更深刻的答案。如果没有人这样做,我会接受这个答案。

我希望有人会有一个详细的答案,但FWIW进程启动似乎天生不可预测。如果您使用Process Monitor观察特定可执行文件启动时发生的情况,它可能会随时间发生很大变化,看起来是随机的。我真的不知道为什么。