Почему смещение "логического дна" и "физического дна" стека является случайным?
Я запускаю программу на своем компьютере с Windows 10 с помощью windbg и позволяю ей сломаться на начальной точке останова. Я беру адрес физического дна стека (stackBase TEB) и вычитаю rsp
ценность ntdll!LdrInitializeThunk
, Я просто сделал это 5 раз в одной и той же программе, и я получил 5 разных значений:
0x600
0x9f0
0xa40
0x5d0
0x570
Вы получите аналогичные результаты, если вы делаете то же самое с ntdll!RtlUserThreadStart
и т. д. Это говорит о том, что "логическое дно" стека несколько рандомизировано. Это почему? Это что-то вроде мини-ASLR внутри стека? Это где-нибудь задокументировано?
1 ответ
После некоторого поиска в ASLR в Vista (ASLR был представлен в Vista), я нашел этот документ от Symantec. На странице 5 он упоминает о явлении, о котором мой вопрос (выделение мое):
Как только стек помещен, начальный указатель стека дополнительно рандомизируется по случайному убыванию. Начальное смещение выбирается равным половине страницы (2048 байт), но ограничено естественно выровненными адресами [...]
Таким образом, кажется, что это сделано намеренно по соображениям безопасности (таким образом сложнее определить адреса вещей, которые находятся с фиксированными смещениями относительно базы стека).
Я оставляю этот вопрос открытым в течение некоторого времени, надеясь, что кто-то может дать более проницательный ответ. Если никто не сделает, я приму этот ответ.