Почему смещение "логического дна" и "физического дна" стека является случайным?

Я запускаю программу на своем компьютере с 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 байт), но ограничено естественно выровненными адресами [...]

Таким образом, кажется, что это сделано намеренно по соображениям безопасности (таким образом сложнее определить адреса вещей, которые находятся с фиксированными смещениями относительно базы стека).

Я оставляю этот вопрос открытым в течение некоторого времени, надеясь, что кто-то может дать более проницательный ответ. Если никто не сделает, я приму этот ответ.

Другие вопросы по тегам