Системные библиотеки 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.