Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #75, МАРТ 2005 г.

Оперируем WinAmp

Ichwill (artem_king@rambler.ru)

Хакер, номер #075, стр. 075-056-3


mov eax, fs:[30h]

mov eax, [eax+0Ch]

mov esi, [eax+1Ch]

lodsd

mov eax, [eax+08h]

После выполнения этих команд в регистре eax будет содержаться адрес загрузки kernel32.dll. Еще одно изменение, которое мы будем вынуждены сделать, это замена

pop ecx

pop ecx

pop ecx

на

pop ecx

pop edi

pop ecx

Вследствие этой замены в регистре edi будет находиться адрес строки «Win», который пригодится нам позже. К сожалению, данный код занимает довольно много места и, конечно же, содержит нулевые байты, поэтому нам придется зашифровать его. Суть метода шифровки заключается в следующем: если у нас есть шелл-код и он содержит нулевые или другие ненужные нам байты, то можно избавиться от них, просто прибавив ко всем байтам нашего шелл-кода (в принципе, можно прибавлять и не ко всем байтам, но это лишние проблемы при расшифровке) определенное число. Это число будем называть смещением. Далее в самом теле жертвы (то есть в уязвимой программе) управление получает не сам шелл-код, а специальная процедура-расшифровщик, которая просто вычитает из каждого байта шелл-кода смещение и после этого передает управление на уже расшифрованный шелл-код. Благодаря этому способу мы с тобой сможем избавиться от ненужных символов в шелл-коде, например от нулевого байта и символа перевода строки.

Дешифратор

Итак, в начале расшифровщика мы помещаем в регистр ecx длину шелл-кода.

xor ecx,ecx

mov cl,длина_шелл-кода

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

Далее нам нужно определить адрес шелл-кода в памяти, для этого мы воспользуемся старым вирусным приемом:

jmp short ends

begin:

pop eax

Тело дешифратора

jmp short shell

ends:

call begin

shell:

Тело зашифрованного шелл-кода

Идея данного метода заключается в следующем: в самом начале мы передаем управление на инструкцию call begin, соответственно, call begin передает управление на pop eax, но до этого адрес инструкции, следующей за call begin, помещается в стек. Pop eax перемещает этот адрес из стека в регистр eax, то есть в eax будет содержаться адрес первого байта зашифрованного шелл-кода. Теперь можно перейти к самому главному, то есть к расшифровке шелл-кода. Это будет, естественно, цикл. В начале цикла мы читаем один байт по адресу [eax] в регистр bl, потом вычитаем из bl наше смещение. Далее записываем получившийся в регистре bl байт по тому же самому адресу. Увеличиваем eax на единицу и передаем управление на начало цикла. Отсюда, после первого прохода по телу цикла первый байт шелл-кода будет расшифрован, а регистр eax будет содержать адрес следующего байта шелл-кода. Всего цикл будет выполняться ecx+1 раз. А так как в ecx находится длина шелл-кода, то шелл-код полностью расшифруется. Чтобы не быть голословным, приведу листинг дешифровщика:

Назад на стр. 075-056-2  Содержание  Вперед на стр. 075-056-4