2016-07-03 12 views
2

Я запускаю программу на своей машине с Windows 10 с помощью windbg и позволяю ей ломаться на начальной точке останова. Я беру адрес физического дна стека (stackBase TEB) и вычитаю значение rspntdll!LdrInitializeThunk. Я просто сделал это 5 раз на одной и той же программе, и я получил 5 различных значений:Почему смещение «логического дна» и «физического дна» стека случайное?

0x600 
0x9f0 
0xa40 
0x5d0 
0x570 

Вы получаете подобные результаты, если вы делаете то же самое с ntdll!RtlUserThreadStart и т.д. Это говорит о том, что «логическое дно» стека несколько рандомизирован. Почему это? Это какой-то «мини-ASLR» внутри стека? Является ли это документированным где угодно?

+1

Я надеялся, что у кого-то будет подробный ответ, но запуск процесса FWIW по своей сути непредсказуем. Если вы используете Process Monitor для просмотра того, что происходит, когда запускается какой-либо конкретный исполняемый файл, он может время от времени различаться, по-видимому, случайным образом. Я действительно не знаю, почему. –

ответ

1

После некоторого поиска в ASLR в Vista (ASLR был введен в Vista), я нашел this document от Symantec. На странице 5, она упоминает явление, что мой вопрос о (курсив мой):

После того, как стек был помещен, начальный указатель стека далее рандомизированы случайным декрементной суммы. Начальное смещение выбирается до половины страницы (2,048 байт), но ограничивается естественно выровненные адреса [...]

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

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