ASLR от Microsoft странный - PullRequest
       36

ASLR от Microsoft странный

4 голосов
/ 07 сентября 2010

Я наблюдал за ASLRed dll адресом изображений для 32-битного процесса.
Это не полностью рандомизация. Это просто рандомизировало вероятность 1/2.

Например, когда я загружаю dll, изображение загружается на 0x12345678 .
И я загружаю изображение снова, изображение загружается на 0x23456789 . (Базовый адрес изменен!)
Но я загружаю изображение снова
0x12345678
0x23456789
0x12345678
0x23456789

...

Почему они так реализовали?
Это для частоты отчетов о сбоях (для получения одинаковых адресов сбоя повторно развернутых dll)

Ответы [ 3 ]

12 голосов
/ 08 сентября 2010

Это по замыслу.Обычно Windows выбирает предпочтительный базовый адрес для библиотеки ASLR при первой загрузке библиотеки DLL, а затем продолжает использовать этот адрес до перезагрузки системы.Таким образом, DLL будет отображаться по одному и тому же адресу в каждом процессе, который ее загружает, что позволяет совместно использовать кодовые страницы.

Однако, если DLL выгружена из каждого процесса, система может иногда выбрать другойбазовый адрес при следующей загрузке DLL.Это делается для уменьшения фрагментации виртуального адресного пространства, а не по соображениям безопасности.Это то, что происходит в вашем случае.

2 голосов
/ 07 сентября 2010

Это задокументировано как один из 1 из 256 возможных начальных адресов .

Но я не думал, что это даже применимо к процессу, но к общим DLL.

ASLR: не включено по умолчанию для образов процесса . Это опция для совместимости. ( 3 )

Рандомизация размещения адресного пространства (ASLR)

ASLR перемещает исполняемые образы в случайные места при загрузке системы, усложнить использование кода для действовать предсказуемо. Для компонента для поддержки ASLR, все компоненты, которые он также должен поддерживать ASLR. За Например, если A.exe потребляет B.dll и C.dll, все три должны поддерживать ASLR. От по умолчанию Windows Vista и более поздние версии рандомизировать системные DLL и EXE, но DLL и EXE, созданные ISVs, должны выбрать в поддержку ASLR с помощью Опция компоновщика / DYNAMICBASE.

ASLR также рандомизирует кучу и стек память:

  • Когда приложение создает кучу в Windows Vista и более поздние, куча менеджер создаст эту кучу в случайное местоположение, чтобы помочь уменьшить вероятность того, что попытка использовать Переполнение буфера на основе кучи успешно выполнено. Рандомизация кучи включена по умолчанию для всех запущенных приложений в Windows Vista и более поздних версиях.

  • Когда поток начинается в процессе, связанном с / DYNAMICBASE, Windows Vista и более поздние версии перемещает стек потока в случайном порядке место, чтобы помочь уменьшить шанс что переполнение буфера на основе стека эксплойт будет успешным.

0 голосов
/ 10 июня 2012

Вчера установил новую Win8 RC x64.

Берегись!

Kernel32.dll (64-разрядная версия) имеет разные базовые адреса в разных процессах (конечно, в одном сеансе). Только базовый адрес ntdll.dll остается постоянным. Мне пришлось изменить код, вы больше не можете полагаться на постоянный адрес Loadlibrary.

...