Как я могу определить, применяет ли Windows ASLR без перезагрузки?
Насколько я понимаю, рандомизация структуры адресного пространства ASLR будет производить только случайное перемещение при запуске системы (при перезагрузке).
Рандомизация размещения адресного пространства (ASLR)
ASLR перемещает исполняемые образы в случайные места при загрузке системы, что затрудняет предсказуемую работу кода эксплойта. (...)
Если это так, как я могу затем "проверить" или, вернее, проверить, что ASLR происходит для моего модуля C++ или для системного модуля (скажем, kernel32.dll
) без многократного перезапуска Windows и надежды на случайность?
1 ответ
Вот что я бы попробовал:
Помните, что модуль HMODULE
дескриптор на самом деле является базовым адресом изображения модуля. Ты можешь использовать GetModuleHandle
чтобы получить это значение. Если вы сравните это с базовым адресом в необязательных значениях заголовка изображения, мы ожидаем, что эти два значения будут разными, когда ASLR включен.
Имейте в виду, что это будет четким показателем ASLR только тогда, когда GetModuleHandle
используется в определенных системных DLL; это будет работать для kernel32
потому что это не типичный кандидат для перемещения изображения:
- Системным DLL-библиотекам Microsoft присваиваются уникальные рекомендуемые базовые адреса; а также
- Это одна из первых библиотек DLL, сопоставленных с адресным пространством процесса.
поскольку kernel32
обычно не переносится, если ASLR выключен, разумно ожидать, что он будет загружен по рекомендованному базовому адресу.
Как получить рекомендуемый базовый адрес из заголовков изображений? Самый простой способ - это использовать DUMPBIN
Утилита включена в Visual C++. Если вы предпочитаете делать это программно, вам нужно будет немного разобраться в заголовках исполняемого образа, пока вы не найдете IMAGE_OPTIONAL_HEADER
структура-х ImageBase
поле. Для получения дополнительной информации о PE-заголовках я бы порекомендовал "Углубленный взгляд на формат исполняемых файлов Win32", автор Matt Pietrek.