为什么栈的"logical bottom"和"physical bottom"的偏移量是随机的?
Why is the offset of the "logical bottom" and "physical bottom" of the stack random?
我运行 在我的Windows 10 机器上用windbg 编写了一个程序,并让它在初始断点处中断。我获取堆栈的物理底部地址(TEB 的 stackBase),并减去 ntdll!LdrInitializeThunk
的 rsp
值。我只是在同一个程序上做了 5 次,我得到了 5 个不同的值:
0x600
0x9f0
0xa40
0x5d0
0x570
如果对 ntdll!RtlUserThreadStart
等执行相同的操作,您会得到类似的结果。这表明堆栈的 "logical bottom" 在某种程度上是随机的。这是为什么?这是堆栈内部的某种 "mini-ASLR" 吗?这在任何地方都有记录吗?
在专门针对 Vista 中的 ASLR 进行一些谷歌搜索后(ASLR 是在 Vista 中引入的),我从 Symantec 找到了 this document。在第5页,它提到了我的问题是关于(强调我的)的现象:
Once the stack has been placed, the initial stack pointer is further randomized by a random decremental
amount. The initial offset is selected to be up to half a page (2,048 bytes), but is limited to naturally
aligned addresses [...]
所以它似乎是出于安全原因故意完成的(这样就更难找出相对于堆栈基址固定偏移的事物的地址)。
我将这个问题悬而未决一段时间,希望有人能提供更有见地的答案。如果没有人回答,我会接受这个答案。
我运行 在我的Windows 10 机器上用windbg 编写了一个程序,并让它在初始断点处中断。我获取堆栈的物理底部地址(TEB 的 stackBase),并减去 ntdll!LdrInitializeThunk
的 rsp
值。我只是在同一个程序上做了 5 次,我得到了 5 个不同的值:
0x600
0x9f0
0xa40
0x5d0
0x570
如果对 ntdll!RtlUserThreadStart
等执行相同的操作,您会得到类似的结果。这表明堆栈的 "logical bottom" 在某种程度上是随机的。这是为什么?这是堆栈内部的某种 "mini-ASLR" 吗?这在任何地方都有记录吗?
在专门针对 Vista 中的 ASLR 进行一些谷歌搜索后(ASLR 是在 Vista 中引入的),我从 Symantec 找到了 this document。在第5页,它提到了我的问题是关于(强调我的)的现象:
Once the stack has been placed, the initial stack pointer is further randomized by a random decremental amount. The initial offset is selected to be up to half a page (2,048 bytes), but is limited to naturally aligned addresses [...]
所以它似乎是出于安全原因故意完成的(这样就更难找出相对于堆栈基址固定偏移的事物的地址)。
我将这个问题悬而未决一段时间,希望有人能提供更有见地的答案。如果没有人回答,我会接受这个答案。