Системные библиотеки ASLR и Windows для неосведомленных исполняемых файлов?

Из статьи 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    

Глядя на асм 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 ответа

Решение

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

Обновить:

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

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

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

Другие вопросы по тегам