Из статьи 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 (объем этого вопроса) я бы изменить точки останова данных между перезагрузками.)