Stack Shellcode
Last updated
Last updated
Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Stack shellcode ist eine Technik, die in der binary exploitation verwendet wird, bei der ein Angreifer Shellcode auf den Stack eines verwundbaren Programms schreibt und dann den Instruction Pointer (IP) oder Extended Instruction Pointer (EIP) so ändert, dass er auf den Speicherort dieses Shellcodes zeigt, was dessen Ausführung zur Folge hat. Dies ist eine klassische Methode, um unbefugten Zugriff zu erlangen oder beliebige Befehle auf einem Zielsystem auszuführen. Hier ist eine Aufschlüsselung des Prozesses, einschließlich eines einfachen C-Beispiels und wie Sie einen entsprechenden Exploit mit Python und pwntools schreiben könnten.
Lassen Sie uns mit einem einfachen Beispiel eines verwundbaren C-Programms beginnen:
Dieses Programm ist anfällig für einen Pufferüberlauf aufgrund der Verwendung der gets()
-Funktion.
Um dieses Programm zu kompilieren und dabei verschiedene Schutzmaßnahmen zu deaktivieren (um eine anfällige Umgebung zu simulieren), können Sie den folgenden Befehl verwenden:
-fno-stack-protector
: Deaktiviert den Stack-Schutz.
-z execstack
: Macht den Stack ausführbar, was notwendig ist, um Shellcode, der im Stack gespeichert ist, auszuführen.
-no-pie
: Deaktiviert Position Independent Executable, was es einfacher macht, die Speicheradresse vorherzusagen, an der sich unser Shellcode befinden wird.
-m32
: Kompiliert das Programm als 32-Bit ausführbare Datei, oft zur Vereinfachung der Exploit-Entwicklung.
Hier ist, wie Sie einen Exploit in Python mit pwntools schreiben könnten, um einen ret2shellcode Angriff durchzuführen:
Dieses Skript erstellt eine Nutzlast, die aus einem NOP-Slide, dem Shellcode und dann dem Überschreiben des EIP mit der Adresse besteht, die auf das NOP-Slide zeigt, um sicherzustellen, dass der Shellcode ausgeführt wird.
Das NOP-Slide (asm('nop')
) wird verwendet, um die Wahrscheinlichkeit zu erhöhen, dass die Ausführung in unseren Shellcode "gleitet", unabhängig von der genauen Adresse. Passen Sie das Argument p32()
an die Startadresse Ihres Buffers plus einen Offset an, um im NOP-Slide zu landen.
ASLR sollte deaktiviert sein, damit die Adresse bei mehreren Ausführungen zuverlässig ist, oder die Adresse, an der die Funktion gespeichert wird, wird nicht immer gleich sein und Sie benötigen einen Leak, um herauszufinden, wo die Gewinnfunktion geladen ist.
Stack Canaries sollten ebenfalls deaktiviert sein, da die kompromittierte EIP-Rückgabeadresse niemals gefolgt wird.
NX Stack-Schutz würde die Ausführung des Shellcodes im Stack verhindern, da dieser Bereich nicht ausführbar ist.
64-Bit, ASLR mit Stack-Adress-Leak, Shellcode schreiben und zu ihm springen
32-Bit, ASLR mit Stack-Leak, Shellcode schreiben und zu ihm springen
32-Bit, ASLR mit Stack-Leak, Vergleich zur Verhinderung des Aufrufs von exit(), Variable mit einem Wert überschreiben und Shellcode schreiben und zu ihm springen
arm64, kein ASLR, ROP-Gadget, um den Stack ausführbar zu machen und zu Shellcode im Stack zu springen
Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)