Скорая Компьютерная Помощь г. Калуга

Полный спектр компьютерных услуг!

Здравствуйте, гость ( Вход | Регистрация )

> Внимание!

  • Вся информация, расположенная в данном и других разделах форума получена из открытых источников (интернет-ресурсы, средства массовой информации, печатные издания и т.п.) и/или добавлена самими пользователями. Администрация форума предоставляет его участникам площадку для общения / размещения файлов / статей и т.п. и не несет ответственности за содержание сообщений, а также за возможное нарушение авторских, смежных и каких-либо иных прав, которое может повлечь за собой информация, содержащаяся в сообщениях.
Ремонт компьютеров в калуге Рекламное место сдается
 
Ответить в эту темуОткрыть новую тему
> Windows 7. ASLR (Address Space Layout Randomization), OllyDbg, сложности с отладкой
Decker
сообщение 27.2.2011, 10:35
Сообщение #1


Администратор
*****

Группа: Главные администраторы
Сообщений: 14349
Регистрация: 12.10.2007
Из: Twilight Zone
Пользователь №: 1



Эта статья наверное будет неинтересна 99.9% пользователей, но я все же расскажу, т.к. потратил на понимание проблемы достаточно много времени и все-таки нашел решение (хоть уже и 9 утра, а я еще не ложился, все же результатами поделиться нужно). Итак, некоторые слышали что в Windows присутствует технолигия DEP (Data Execution Prevention) - (англ. Предотвращение выполнения данных) — функция безопасности, встроенная в семейство операционных систем Windows, которая не позволяет приложению исполнять код из области памяти, помеченной как «только для данных». Но мало кто слышал об ASLR (Address Space Layout Randomization) - технология, применяемая в операционных системах, при использовании которой случайным образом изменяется расположение в адресном пространстве процесса важных структур, а именно: образа исполняемого файла, подгружаемых библиотек, кучи и стека. Ну так вот ... проблема началась с того, что я поставил SP1 для Windows 7 ... и сразу же заметил работу этого ASLR ... т.к. пользуюсь отладчиком OllyDBG ... удивлению моему не было предела, т.к. при отладке практически любого приложения было видно что адрес загрузки процесса вовсе не равен OptionalHeader.ImageBase, а каким-то хитрым образом рандомизируется операционной системой. Т.е. при каждой загрузке он разный. Это не то чтобы существенно усложняет отладку и патчинг exe'шников, но вносит некоторое неудобство. Да и собственно ранние версии OllyDBG (за исключением последних 2.x бетт) не хотели нормально устанавливать брейкпоинты в такой обстановке. Вообщем стал я читать, читать и "ковырять". Вычитал:

Цитата
Рандомизация загрузки адресного пространства

Несмотря на такие меры, как предотвращение выполнения данных и усовершенствованная проверка ошибок компилятора, создатели вредоносного программного обеспечения продолжают находить уязвимости переполнения буфера, позволяющие им заражать процессы, ориентированные на работу в сети, такие как обозреватель Internet Explorer®, службы Windows и приложения сторонних разработчиков, с целью получения опорного пункта в системе. После удачного заражения процесса, однако, им необходимо использовать интерфейсы API Windows для выполнения своей конечной цели — чтения данных пользователя или обеспечения своего постоянного присутствия посредством изменения параметров пользовательской или системной настройки.

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

Компонент рандомизации загрузки адресного пространства (ASLR) в операционной системе Windows Vista лишает вредоносные программы возможности выяснить местоположение интерфейсов API. Это достигается за счет того, что при каждой загрузке системы системные библиотеки DLL и исполняемые модули загружаются в новом месте. На раннем этапе процедуры первоначальной загрузки диспетчер памяти выбирает случайное смещение для загрузки образа DLL из одного из 256 адресов (выровненных на 64 кБ), имеющихся в области размером 16 МБ в верхней части адресного пространства пользовательского режима. Когда библиотеки DLL, в заголовке образа которых присутствует новый флаг динамического размещения, загружаются в процесс, диспетчер памяти размещает их в памяти начиная с адреса смещения загрузки образа и продолжает по направлению к меньшим адресам.

Исполняемые образы, в которых установлен данный флаг, проходят аналогичную процедуру загрузки в случайную точку, выровненную на 64 КБ, в области размером 16 МБ от базового адреса загрузки, хранящегося в заголовке их образа. Кроме того, если данная библиотека DLL или исполняемый образ снова загружается после того, как был выгружен всеми использовавшими его процессами, диспетчер памяти снова выбирает для загрузки случайное местоположение. На рис. 7 показан пример компоновки адресного пространства для 32-разрядной системы Windows Vista, включая области, из которых ASLR выбирает смещение для загрузки образа и адрес загрузки исполняемого образа.

Только образы, имеющие флаг динамического размещения, к которым относятся все библиотеки DLL операционной системы Windows Vista и исполняемые образы, можно размещать в новых местах, потому что перемещение устаревших образов может привести к нарушению внутренних допущений о месте загрузки образов, сделанных разработчиками. В пакете обновления Visual Studio® 2005 SP1 добавлена поддержка для установки этого флага, чтобы сторонние разработчики могли воспользоваться преимуществами механизма ASLR в полной мере.

Назначение адресов загрузки библиотек DLL, выбираемых случайным образом из 256 местоположений, не лишает вредоносные программы возможности угадывать правильное местоположение интерфейса API, но оно резко снижает скорость распространения сетевого червя и препятствует надежной работе вредоносной программы, получающей только один шанс в инфицированной системе. Кроме того, у стратегии ASLR по изменению местоположения есть дополнительное преимущество, заключающееся в том, что адресные пространства используются более эффективно, чем в предыдущих версиях Windows — создаются обширные участки свободной памяти для распределения памяти смежными областями, уменьшается число таблиц страниц, выделяемых диспетчером памяти для отслеживания компоновки адресного пространства, и минимизируются несовпадения в буфере TLB.


Только вот в Windows 7 SP0 (т.е. без SP) ASLR по-умолчанию был выключен или работал неправильно (не работал). Как выяснилось в любом заголовке PE есть флаг IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE в OptionalHeader.DllCharacteristics, так вот, если он установлен и система поддерживает ASLR, то используется рандомизация адреса загрузки, если не установлен, то не используется. Windows 7 без установленных SP этот флаг просто игнорировала, а с SP1 стала использовать. Если обратиться к описанию IMAGE_OPTIONAL_HEADER Structure, то мы увидим, что IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE = 0x0040, для того чтобы для данного EXE/DLL по-возможности использовался ASLR и 0, чтобы не использовался. Описание флага звучит как "The DLL can be relocated at load time.". Собственно наличие данного флага в заголовке PE зависит от настроек линкера при сборке проекта, ну да рекомендации для кодеров вы прочитаете где-нибудь в другом месте. Здесь же мы рассмотрим как сделать так, чтобы exe'шники при отладке загружались по "нормальному", а не рандомному адресу, даже с включенным ASLR. В моих изысканиях мне очень помог пост How to disable ASLR (Random DLL/EXE memory load location) in Windows 7?:

Цитата
Is there any program that can patch the "dll characteristics" of IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE in the pe header? the website you mention only says 'hex' patching but does not say WHERE.. I tried the 18E address in the screenshots there but no change. Also it only says how to ENABLE it, but I want it DISABLED. I don't care about virus/exploits/protection. I just need ollydbg to work properly when loading DLL and my Tmpgenc DVD Author 4 (Right now I have to revert to DVD Author 3)

Also I found out the term is called ASLR, it can be disabled in Vista, but I tried to disable it in Windows 7 with this

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Contro l\Session Manager\Memory Management]
"MoveImages"=dword:00000000


ASLR
Vista's ASLR randomizes the location of images (PE files mapped into memory), heaps,
stacks, the PEB and TEBs. Image positioning randomization is designed to place images
at a random location in the virtual address space of each process. Vista's ASLR has
the capability to randomly position both executables and DLLs. There is a system-wide
configuration parameter that determines the behaviour of Vista's image randomization.
This parameter can be set in the registry key
HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\MoveImages
which by default does not exist. This key has three possible settings:
If the value is set to 0, never randomize image bases in memory, always honor the base
address specified in the PE header.
If set to -1, randomize all relocatable images regardless of whether they have the
IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE flag or not.
If set to any other value, randomize only images that have relocation information and are
explicitly marked as compatible with ASLR by setting the
IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE (0x40) flag in DllCharacteristics field
the PE header. This is the default behaviour.

I tried to the file in ollydbg, and when it loads the DLL, the offsets are different, thats why I know ASLR is still enabled.
(I am using Windows 7 Beta)

Also, what are the SortServer2003Compat.dll (XP SP3), and SortWindows6Compat.dll (Vista SP2) that is prevent my DLL from being seen when loaded under ollydbg with Compatibility mode?

Many cracked/patched apps will crash because of this, unless someone can disable ASLR somehow in Windows 7.

So no one here uses Windows 7 as their cracking system?


Отсюда становится понятно как глобально отключить ASLR ... через ключ реестра:
Код
HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\MoveImages

Кстати посмотреть какие процессы запущены и используют ASLR, т.е. загружены по рандомным адресам можно с помощью Process Explorer'а, добавив колонку ASLR в представление вида:
Прикрепленное изображение

Ну а теперь собственно лезем HIEW'ом во влаги PE (F8 -> F3):
Прикрепленное изображение

Вот он наш родной IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE. Без него приложение загружается "как положено", т.е. по ImageBase. Таким образом OEP (Original Entry Point) = ImageBase + EntryPoint из заголовка PE:
Прикрепленное изображение
Прикрепленное изображение

В данном случае как видно - это 00401817 (т.е. 00400000 + 1817) ... Однако если установить флаг IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE, т.е. отредактировать PE заголовок exe'шника и загрузить файл в отладчик снова, то VA у OEP будет совершенно другой:

Прикрепленное изображение

Видно, что OEP находится уже по VA = 01131817, т.е. ОС рандомизировала адрес загрузки exe в память.

Информация эта будет крайне полезна для тех кто занимается реверсингом / отладкой, а также пишет разные специфические вещи. А что может извлечь из нее простой пользователь? Ну например то, что приложения криво слинкованные не запустятся или будут падать на ОС использующей ASLR в полном объеме. А я повторюсь, про то, что Win7 без SP успешно забивала на на флаг IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE, т.е. ASLR в ней фактически не работал, а вот начиная с SP1 - он заработал. Поэтому некоторые приложения работавшие у вас раньше, могут не заработать на системе с поддержкой ASLR, ну разве что вы не выставите в их свойствах флажок запуска в режиме совместимости. Так что такая вот поучительная статья ... на понимание всех этих моментов я потратил около 3-х часов ... как раз в то время, когда занимался написанием патча под несколько входящих VPN соединений в Win7 wink.gif Все ... уже 10 утра ... а я еще не ложился ... (( Пойду спать ... и да пребудет с вами сила ... ))

Ссылки и статьи:

http://technet.microsoft.com/en-us/magazin...istakernel.aspx - Inside the Windows Vista Kernel: Part 3
http://www.oszone.net/4809_2/Windows_Vista - Внутреннее устройство ядра Windows Vista: Часть 3
http://www.uinc.ru/articles/41/ - Об упаковщиках в последний раз: Часть первая - теоретическая (здесь можно прочитать об RVA/VA и иже с ними)
http://www.intuit.ru/department/pl/cil/3/3.html - Обзор структуры PE-файла
http://msdn.microsoft.com/en-us/library/ms680339 - IMAGE_OPTIONAL_HEADER Structure
http://blog.koroirc.com/2008/06/migrating-...-disables-aslr/ - Migrating a project from VS2005 to VS2008 disables ASLR.
http://forums.mydigitallife.info/threads/5...n)-in-Windows-7 - How to disable ASLR (Random DLL/EXE memory load location) in Windows 7?
http://lhc645.wordpress.com/2010/03/10/aslrtls/ - ASLR+TLS


--------------------

Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения

Ответить в эту темуОткрыть новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

Рекламное место сдается Рекламное место сдается
Текстовая версия Сейчас: 25.9.2020, 1:37
Рейтинг@Mail.ru
Яндекс.Метрика Яндекс цитирования