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

         

древний антидизассемблерный трюк — прыжок в середину команды


Команда "CALL LOC_19+1" прыгает куда-то в середину инструкции PUSH, засылающей в стек константу FFFFFFEBh в которой опытные кодокопатели уже наверняка увидели инструкцию безусловного перехода, заданную опкодом EBh, а вся команда выглядит так: EBh 4Dh, где 4Dh "отрываются" от инструкции DEC EBP. Важно не забывать, что PUSH

с опкодом 6Ah — это знаковая команда, то есть никаких FFh в самом опкоде нет, поэтому вместо перехода по адресу EBh FFh (как это следует из дизассемблерного текста) мы получаем переход по адресу EBh 4Dh (как это следует из машинного кода), что совсем не одно и тоже! Сам переход, кстати говоря, относительный и вычисляется от конца команды JMP, длина которой в данном случае равна двум. Складываем 4Dh (целевой адрес перехода) с 1Ah (адрес самой команды перехода — loc_19 + 1 = 1Ah) и получаем 69h. Именно по этому смещению и будет передано управление! А команды, идущие за инструкцией CALL,

расположены чисто для маскировки, чтобы противник подольше голову поломал.

Хорошо, отправляется в район 69h и смотрим что хорошего у нас там:

seg000:00000069 31 DB             xor    ebx, ebx      ; ebx := 0

seg000:0000006B 64 8B 43 30 mov    eax, fs:[ebx+30h] ; PEB

seg000:0000006F 8B 40 0C   mov    eax, [eax+0Ch]       ; PEB_LDR_DATA

seg000:00000072 8B 70 1C   mov    esi, [eax+1Ch]       ; InInitializationOrderModuleList

seg000:00000075 AD         lodsd                ; EAX := *ESI

seg000:00000076 8B 40 08   mov    eax, [eax+8]  ; BASE of KERNEL32.DLL



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