Системные библиотеки ASLR и Windows для неосведомленных исполняемых файлов? - PullRequest
2 голосов
/ 18 июня 2011

Из статьи Microsoft :

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

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

Я не совсем понял. Возьмите библиотеки DLL базовой системы, загруженные каждым процессом в Windows: NtDll.dll и kernel32.dll.

Если у вас есть исполняемый файл без информации, будут ли эти системные библиотеки DLL использовать ASLR? То есть, будут ли они загружаться по разному базовому адресу после каждой перезагрузки системы на Win 7 для этого исполняемого файла, или они всегда будут загружаться по тому же базовому адресу после перезагрузки системы, как они делают на Win XP?

Чтобы было более понятно, что я имею в виду: Стек запуска моей типичной фиктивной программы будет выглядеть так:

    write_cons.exe!wmain()  Line 8  C++
    write_cons.exe!__tmainCRTStartup()  Line 583 + 0x19 bytes   C
    write_cons.exe!wmainCRTStartup()  Line 403  C
>   kernel32.dll!_BaseProcessStart@4()  + 0x23 bytes    

Глядя на asm из BaseProcessStart, я вижу на своем XP поле здесь:

_BaseProcessStart@4:
7C817054  push        0Ch  
7C817056  push        7C817080h 
7C81705B  call        __SEH_prolog (7C8024D6h) 
7C817060  and         dword ptr [ebp-4],0 
...

Теперь меня интересует следующее:

В Windows XP адрес будет всегда быть 0x7C817054, независимо от того, сколько раз я перезагружал эту машину. Если бы я работал на Win7 с ASLR, изменит ли этот адрес между перезагрузками, если исполняемый файл, который загружает kernel32.dll, не включен для ASLR?

(Примечание: для меня, атм., Есть только один незначительный вариант использования, для которого этот адрес был бы полезен: в Visual Studio я могу установить только «точку останова данных» для функций уровня сборки, то есть точку останова @ 0x7 ... - Если я хочу взломать определенную функцию ntdll.dll или kernel32.dll, в Windows XP мне не нужно настраивать мои точки останова между перезагрузками. С включением ASLR (объем этого вопроса) я бы изменить точки останова данных между перезагрузками.)

Ответы [ 2 ]

4 голосов
/ 18 июня 2011

Технически, независимо от того, перемещены системные dll или нет, это не должно иметь значения, так как компоновщик будет связываться с символами, а не с адресами.Эти символы преобразуются загрузчиком времени выполнения в адреса для системных экземпляров dll, поэтому ваш двоичный файл не должен быть мудрее.Однако из того, что я видел, windows 7 будет сбрасывать базовую рандомизацию при каждой перезагрузке, включая системные dll (примечание: это отладка приложений WOW64 на сервере вдов 2008 R2).Вы также можете сделать отключение ASLR в масштабе всей системы с помощью некоторых изменений реестра, но это не очень актуально ...

Обновление:

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

1 голос
/ 18 июня 2011

Ваша программа будет разрешать вызовы в системные библиотеки DLL, где бы они ни загружались.Но, если ваш исполняемый файл не связан с / DYNAMICBASE, ему не будет дан случайный базовый адрес.Другими словами, ваш exe-файл всегда будет загружаться по одному и тому же базовому адресу.

Если вы хотите, чтобы ваш exe-файл загружался по случайному адресу, вам нужно связать его с / DYNAMICBASE, и каждая DLL, на которую он ссылается, должнатакже были связаны с / DYANMICBASE.Все системные библиотеки DLL (начиная с Vista) связаны с /DYNAMICBASE.

...