Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #45, АВГУСТ 2004 г.

Пишем shell-код!

Коваленко Дмитрий aka Ingrem

Спецвыпуск Xakep, номер #045, стр. 045-014-2


Листинг

Алгоритм процедуры поиска адреса API-функции по ее имени

; процедура находит адрес api и смещение этого адреса в таблице экспорта

; вход: ecx -- длина имени

; esi -- адрес строки с именем

; выход: ebx -- адрес адреса API

; edx -- адрес API

; eax -- адрес "головы" kernel32.dll

getapi2k proc

Сначала нужно найти какой-то адрес внутри kernel32.dll. Для этого мы просканируем цепочку SEH-структур. Указатель на первую такую структуру лежит по fs:[0]. SEH-структура имеет довольно интересное строение: ее первое двойное слово – адрес следующей в цепочке SEH-структуры, второе двойное слово – адрес exeption обработчика. Последняя в цепочке структура первым двойным словом имеет 0xFFFFFFFF, а вторым – адрес системного exeption обработчика (именно он выдает "Инструкция по адресу 0x???????? обратилась...").

Листинг

mov eax, fs:[0] ; заносим в eax адрес первой структуры SEH

getapi2k_10: ; идем дальше по цепочке SEH-стуктур

mov ebx, [eax] ; заносим в ebx адрес следующей SEH-структуры

cmp ebx, -1 ; адрес равен 0FFFFFFFFh?

je getapi2k_20 ; да! - значит эта SEH-структура - последняя в цепочке

mov eax, ebx ; нет... идем дальше

jmp short getapi2k_10

getapi2k_20:

mov eax, [eax+4]

Теперь eax содержит какой-то адрес внутри kernel32.dll. При загрузке PE-файла Windows помещает его образ по адресу, кратному 64 K. Найдем адрес образа kernel32.dll (фактически адрес его DOS стаба). Учтем, что kernel32.dll первыми двумя байтами имеет сигнатуру 'MZ'.

Листинг

xor ax, ax ; выровняем найденный адрес на 64 К

getapi2k_1:

mov ebx, [eax] ; читаем 4 байта в ebx

cmp bx, 5A4Dh ; 'MZ' найден?

je getapi2k_2; да!

sub eax, 010000h; нет - увеличим eax на 64 К

jmp short getapi2k_1

getapi2k_2:

На данном этапе eax содержит адрес DOS стаба kernel32.dll. Проанализируем образ kernel32.dll в памяти. Цель – найти таблицу экспорта. Анализ реализуется следующим образом:

Листинг

; поскольку в PE все смещения записаны относительно адреса DOS

; стаба, то нам придется все время их корректировать, добавляя

; к смещениям eax

mov ebx, eax ; копируем в ebx адрес DOS стаба

add ebx, [eax+3Ch]; добавляем к ebx смещение PE заголовка

; (оно лежит по смещению 0x3C от начала стаба)

add ebx, 78h ; добавляем к ebx смещение указателя на таблицу экспорта

;относительно заголовка PE

Назад на стр. 045-014-1  Содержание  Вперед на стр. 045-014-3