Skip to content
shellcodes

Was ist Shellcode? Ein vollständiger Leitfaden

Shellcode erklärt: was er ist, warum Exploits ihn nutzen, wie er geschrieben und kodiert wird, und wie man ihn sicher im Browser erzeugt und testet.

Veröffentlicht am 4 Min. Lesezeit

Shellcode ist ein kleines Stück positionsunabhängiger Maschinencode, das als Payload eines Exploits läuft. Sobald ein Bug dir Kontrolle über den Instruction Pointer gibt, ist der Shellcode das, was als Nächstes ausgeführt wird. Dieser Leitfaden erklärt, was er ist, die gängigen Typen, die Constraints, die ihn brechen, und wie man ihn sicher erzeugt und analysiert.

Was ist Shellcode?

Shellcode sind rohe CPU-Instruktionen, kein Programm, das du aus einer Shell startest. Er hat keinen Loader, keine Header und keinen Linker — nur Bytes, die ein Prozessor direkt ausführt, sobald dein Exploit die Kontrolle dorthin umleitet. Da er an einer Adresse landet, die du vorher nicht kennst, muss er positionsunabhängig sein: keine fest kodierten absoluten Adressen, alles relativ.

Warum heißt es "Shellcode"?

Die ursprünglichen Payloads taten genau eine Sache: eine Kommando-Shell starten (/bin/sh unter Unix, cmd.exe unter Windows) und dem Angreifer interaktive Kontrolle geben. Der Name hat die enge Bedeutung überlebt. Heute bezeichnet "Shellcode" jeden kleinen Maschinencode-Payload, egal ob er eine Shell öffnet, nach Hause telefoniert oder eine größere Stufe nachlädt.

Wie Shellcode funktioniert

Ein typischer Ablauf:

  1. Eine Schwachstelle (Stack Overflow, Use-after-free, Format String) erlaubt dir, einen Kontrollwert zu überschreiben.
  2. Du leitest die Ausführung in einen Buffer um, den du kontrollierst.
  3. Die CPU beginnt, deine Bytes als Instruktionen auszuführen.
  4. Der Shellcode richtet Register ein und löst einen Systemaufruf aus, um seine Arbeit zu tun.

Unter Linux ist dieser letzte Schritt meist eine syscall-/int 0x80-Instruktion; unter Windows werden API-Funktionen aufgelöst und aufgerufen. So oder so muss der Code in sich geschlossen sein und jeden vorhandenen Speicherschutz überstehen.

Typen von Shellcode

  • Exec / lokal — führt einen Befehl an Ort und Stelle aus. Klein und leise. Gut, wenn du bereits einen Kanal hast.
  • Reverse TCP — verbindet sich zurück zu deinem Listener für eine interaktive Sitzung.
  • Bind — öffnet einen Port auf dem Ziel und wartet.
  • Staged vs. Stageless — ein kleiner Stager lädt einen größeren Payload nach, gegenüber dem Ausliefern von allem auf einmal.

Welchen man nimmt, ist eine Funktion der Primitive und der Umgebung, nicht der Option, die am coolsten aussieht. Siehe Linux exec vs. Reverse TCP für die Abwägung.

Wie Shellcode aussieht

Ein 25 Bytes großer Linux-x86-execve("/bin/sh"):

\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80

Diese Bytes nullen ein Register, schieben /bin//sh auf den Stack, richten die execve-Argumente ein und lösen den Syscall aus. Mehr dazu, mit der Disassemblierung daneben, in den Shellcode-Beispielen.

Bad Chars und Null-Bytes

Die Auslieferung schickt deine Bytes oft durch String-Funktionen. Ein einzelnes 0x00 kann strcpy-artige Kopien abschneiden und deinen Payload halbieren; Newlines, Leerzeichen und Slashes brechen andere Parser. Deshalb werden Payloads kodiert, um bestimmte Bytewerte zu vermeiden. Daher kommen auch die meisten "im Debugger lief es, auf dem Ziel nicht"-Fehler — siehe Null-Bytes in Shellcode.

Wie Shellcode erzeugt wird

Drei gängige Wege — handgeschriebenes Assembly, ein Framework wie msfvenom, oder ein Generator, der für dich assembliert und kodiert. Sie unterscheiden sich in Kontrolle, Portabilität und darin, wie viel Vertrauen du in fremde Bytes legst. Der vollständige Vergleich steht in Shellcode erzeugen. Im Shellcodes-Builder kannst du Payloads vollständig client-seitig bauen und kodieren, ohne ein Framework zu installieren.

Wie man Shellcode analysiert

Bevor du Bytes ausführst — besonders Bytes, die du nicht selbst geschrieben hast — dekodiere und disassembliere sie. Einen \x-escapten Blob zurück in Mnemonics zu verwandeln zeigt, was er wirklich tut, und bringt Bad Chars zum Vorschein. Der Shellcodes-Converter disassembliert mit Capstone; den Workflow findest du in Shellcode dekodieren und disassemblieren.

Rechtliche und ethische Nutzung

Shellcode ist Dual-Use. Ihn zu schreiben, zu erzeugen und zu testen ist legitim für autorisierte Penetrationstests, CTFs, Exploit-Forschung und Detection Engineering — und illegal gegen Systeme, die du nicht besitzt oder zu testen berechtigt bist. Halte ihn in Labs und im vereinbarten Scope. Siehe die Richtlinie zur verantwortungsvollen Nutzung.

FAQ

Ist Shellcode ein Virus? Nein. Er ist eine Payload-Technik. Bösartig wird er erst in Kombination mit einem Exploit gegen ein Ziel, das du nicht testen darfst.

In welcher Sprache wird Shellcode geschrieben? In Assembly, dann zu rohen Maschinencode-Bytes assembliert. Oft wird die Logik zuerst in C prototypisiert, um die richtigen Syscalls zu finden.

Wie führe ich Shellcode sicher aus? In einer isolierten Lab-VM oder einem Container, den du kontrollierst, nachdem du ihn dekodiert und disassembliert hast, sodass du genau weißt, was er tut.

Verwandte Artikel

Rohe Shellcode-Bytes zurück in Assembly verwandeln — Hex- und Escape-Formate dekodieren, mit Capstone disassemblieren und Bad Chars finden, bevor du ihn ausführst.
Kommentierte Shellcode-Beispiele für Linux x86 und x64 — execve /bin/sh und Reverse TCP — mit den Bytes, der Disassemblierung und den Fallstricken.
Wie Linux-Shellcode funktioniert — Syscalls, Register und positionsunabhängiger Code — und wie man ihn sicher assembliert, kodiert und testet.