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

карта размещения среды в стековой памяти


Из этой схемы видно, что команда POP EBX выталкивает в регистр EBX адрес последний FPU-инструкции, которой и является FLDZ, расположенной по смещению 5h (условно). При исполнении на "живом" процессоре смещение будет наверняка другим и чтобы не погибнуть, shell-код должен определить где именно он располагается в памяти. Разработчик shell-кода применил довольно необычный подход, в то время как подавляющее большинство ограничивается тупым CALL/POP REG. Сложив полученное смещение 5h с константой 13h, фигурирующей в инструкции XOR, мы получим 18h – адрес первого зашифрованного байта.

Зная значения регистров, нетрудно расшифровать shell-код. В IDA Pro для этого достаточно написать следующий скрипт:

auto a,x;                                // объявление переменных

for(a = 0; a < 0x50; a++)                // цикл расшифровки

{

       x=Dword(MK_FP("seg000",a*4+0x18));
// читаем очередной двойное слово

       x

=  x ^ 0x3704F519;              // расшифровываем

       PatchDword(MK_FP("seg000",a*4+0x18),x);
//записываем расшифрованное значение

}



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