последовательность 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-фрейм