Как определить, участвует ли EXE (или DLL) в ASLR, то есть можно ли перемещать?
Как определить, участвует ли EXE (или DLL) в ASLR, то есть можно ли перемещать?
Я хочу проверить некоторые EXE-файлы в моей системе, можно ли их перемещать и участвовать в ASLR.
Я знаю, что поведение компоновщика по умолчанию состоит в удалении базовых перемещений, чтобы EXE не перемещался?
Как я могу увидеть из такого инструмента, как FileAlyzer, участвует ли изображение в ASLR?
1 ответ
Перемещаемый модуль (exe или dll) не обязательно должен включать ASLR, но модуль с включенным ASLR должен быть перемещаемым.
Модуль с поддержкой ASLR (использующий переключатель компоновщика /DYNAMICBASE) будет загружен по произвольному адресу независимо от его ImageBase (предпочтительный адрес загрузки), и поэтому он должен быть перемещаемым или не может быть загружен.
Если модуль не поддерживает ASLR, загрузчик сначала попытается загрузить его в ImageBase. Если это невозможно (память уже выделена), она попытается загрузить ее по другому адресу; если модуль перемещаем, он будет успешным, если нет, то потерпит неудачу.
Как определить перемещаемый модуль?
Модуль, который нельзя перемещать, будет иметь битовый флаг IMAGE_FILE_RELOCS_STRIPPED (0x0001), установленный в поле "Характеристики" своего заголовка файла. У перемещаемого модуля этот бит будет очищен, и у него также будет раздел с перемещениями (например,.reloc). Вы можете проверить этот флаг с помощью программного обеспечения, такого как PEView или dumpbin /headers your_module.exe
(или dll)
Как определить модуль с включенным ASLR?
Модуль с поддержкой ASLR будет перемещаемым (флаг удаления лишних перемещений не установлен), а также будет иметь флаг IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE (0x0040), установленный в поле DllCharacteristics необязательного заголовка. DllCharacteristics используется как для EXE, так и для DLL независимо от его имени.
Опять же, вы можете проверить наличие этого флага с помощью проводника PE-файлов, такого как PEView или dumpbin /headers your_module.dll
(или exe).