Аудит и дизассемблирование exploit'ов

последовательность pop reg/pop reg/retn, содержащаяся в mqsvc.exe файле


Естественно, данный способ не универсален и вообще говоря ненадежен, поскольку, в другой версии mqsvc.exe адрес "магической" последовательности наверняка будет иной, хотя в Windows 2000 Home, Windows 2000 Professional, Windows 2000 Server/AdvServer адреса совпадают, поскольку используется одна и та же версия mqsvc.exe, а вот в Windows XP адрес уже "уплывает".

Интуитивно мы чувствуем, что передача управления на shell-код осуществляется через RET, но остается непонятным каким образом указатель на shell-код мог очутиться в стеке, ведь никто туда его явно не засылал! Запихать в переполняющийся буфер можно все, что угодно, но при этом придется указать точный адрес размещения shell-кода в памяти, а для этого необходимо знать значение регистра ESP на момент атаки, а оно в общем случае неизвестно.

Структурные исключения позволяют элегантно решить эту задачу. Вместо того, чтобы затирать адрес возврата (как делало это целое поклонение кодокопателей), мы подменяем оригинальный SEH-фрейм атакуемой программы своим. Теоретически, SEH-фреймы могут быть расположены в любом месте, но практически все известные компиляторы размещают их в стеке, на вершине кадра функции, то есть по соседству с сохраненным EPB и RET'ом:

.text:0040104D             push   ebp                  ; открыть новый...

.text:0040104E             mov    ebp, esp             ;             ...кадр

стека

.text:00401050             push   0FFFFFFFFh           ; это последний SEH-фрейм

.text:00401052             push   offset stru_407020   ; предшествующий SEH-обработчик

.text:00401057             push   offset _except_handler3; новый SEH-обработчик

.text:0040105C             mov    eax, large fs:0      ; получить указатель на SEH-фрейм

.text:00401062             push   eax                  ; предыдущий SEH-обработчик

.text:00401063             mov    large fs:0, esp      ; зарегистрировать новый SEH-фрейм



Содержание раздела