我使用windbg在我的Windows 10机器上运行程序,让它在初始断点处中断。我获取堆栈物理底部的地址(TEB的stackBase),并减去rsp
的{{1}}值。我只是在同一个程序上做了5次,我得到了5个不同的值:
ntdll!LdrInitializeThunk
如果你对0x600
0x9f0
0xa40
0x5d0
0x570
等做同样的事情,你会得到类似的结果。这表明"逻辑底部"堆栈有点随机化。这是为什么?这是某种" mini-ASLR"堆栈里面?这是在任何地方记录的吗?
答案 0 :(得分:1)
在Vista中专门搜索ASLR(在Vista中引入ASLR)之后,我发现了赛门铁克的this document。在第5页,它提到了我的问题所在的现象(强调我的):
放置堆栈后,初始堆栈指针被随机递减进一步随机化 量。初始偏移量选择为最多半页(2,048字节),但自然受限 对齐的地址[...]
因此,出于安全原因,它似乎是故意完成的(这样就很难找出相对于堆栈基础的固定偏移量的地址)。
我打开这个问题一段时间,希望有人能提供更有见地的答案。如果没有人,我会接受这个答案。