
Windows x86 PoC: Stack‑basierter Pufferüberlauf mit benutzerdefiniertem Shellcode auf älterem 32-Bit-Windows.
Dies ist ein einfaches, in sich geschlossenes Tutorial zu Stack-basierten Buffer-Overflow-Exploits für 32-Bit-Windows. Es sind keine externen Anleitungen erforderlich – alles Nötige ist hier enthalten.
vulnerable.c: Ein einfaches Programm mit einer unsicheren gets()-Funktion.messageBox.asm: Ein kleine Assembly-Payload, die nach dem Überlauf ausgeführt wird.exploit.c: Ein Beispiel, wie der Überlauf ausgelöst werden könnte.Dieses Projekt vermittelt eine Kernidee: Unsicheres Einlesen von Eingaben kann einem Angreifer ermöglichen, die Rücksprungadresse zu überschreiben und die Ausführung umzuleiten.
gets() hat keine GrößenbegrenzungIn vulnerable.c macht das Programm Folgendes:
char buffer[32];
gets(buffer);
Das Programm reserviert 32 Bytes für buffer und ruft dann gets() auf, um Eingaben zu lesen.
Das Problem: gets() prüft die Puffergröße nicht.
Es liest so lange Zeichen, bis es einen Zeilenumbruch findet.
Wenn der Benutzer 40 oder 50 Zeichen eingibt, laufen die zusätzlichen Zeichen über den 32-Byte-Puffer über.
Wenn eine C-Funktion ausgeführt wird, speichert der Stack (eine Speicherregion):
buffer)EBP (Basispointer der aufrufenden Funktion)Stellen Sie es sich so vor:
Niedrigere Adressen (oberer Rand des Stacks in der Darstellung)
[ buffer (32 Bytes) ]
[ saved EBP (4 Bytes) ]
[ return address (4 Bytes) ]
Höhere Adressen (unterer Rand)
Wenn gets() den buffer mit zu vielen Eingaben überläuft, überschreiben die zusätzlichen Bytes das gespeicherte EBP und dann die Rücksprungadresse.
Wenn wir den Überlauf sorgfältig so konstruieren, dass eine bestimmte Adresse in das Feld der Rücksprungadresse gesetzt wird, springt die CPU zu dieser Adresse, wenn die Funktion versucht zurückzukehren.
buffer[32] auf dem Stack.gets(buffer) auf, um eine Zeile Benutzereingabe zu lesen.gets() hat keine Größenprüfung, daher schreibt es alle 50 Bytes in den Puffer.buffer hinaus und überschreiben das gespeicherte EBP und die Rücksprungadresse.Dies ist die einfachste Form der Codeausführung durch einen Pufferüberlauf.
messageBox.asm ist ein kleines Stück Code, das nach dem Überlauf ausgeführt werden soll.
Es macht Folgendes:
LoadLibraryA mit dem String "USER32.DLL" auf, um sicherzustellen, dass die Bibliothek im Speicher ist.ExitProcess auf, um das Programm sicher zu beenden.Der entscheidende Punkt: Dies ist ausführbarer Code, der ausgeführt wird, nachdem der Überlauf die Ausführung darauf umgeleitet hat. Wenn das Meldungsfenster auf dem Bildschirm erscheint, beweist es drei Dinge:
In einem echten Angriff könnte diese Payload alles tun: Daten stehlen, einen Benutzer anlegen, Malware herunterladen usw. Das Meldungsfenster ist nur eine sichtbare, sichere Möglichkeit zu demonstrieren, dass beliebige Codeausführung stattgefunden hat.
Diese spezielle Payload verwendet fest codierte Speicheradressen für MessageBoxA (0x751D8830) und ExitProcess (0x7437ADB0).
Diese Adressen sind spezifisch für ein System. Die Payload müsste für eine andere Windows-Version oder ein anderes System angepasst werden.

Moderne Windows-Versionen haben mehrere Sicherheitsfunktionen, die diesen Exploit verhindern:
Für dieses Lernbeispiel deaktivieren wir alle.
Verwenden Sie MSVC (Microsoft Visual C++) mit bestimmten Flags:
cl /c /GS- /W3 /Zl vulnerable.c
link /SUBSYSTEM:CONSOLE /DYNAMICBASE:NO /NXCOMPAT:NO vulnerable.obj /OUT:vulnerable.exe
Bedeutung der Flags:
/GS- deaktiviert den Pufferüberlaufschutz des Stacks./DYNAMICBASE:NO deaktiviert die Address Space Layout Randomization (ASLR)./NXCOMPAT:NO deaktiviert DEP und erlaubt die Ausführung von Code auf dem Stack.Wenn Sie die ausführbare Datei bereits haben, können Sie die Schutzmaßnahmen mit editbin deaktivieren:
editbin /NXCOMPAT:NO /DYNAMICBASE:NO vulnerable.exe
vulnerable.exe.Diese README erklärt:
gets() ist und warum es unsicher ist (keine Größenbegrenzung).Sie verstehen jetzt den gesamten Ablauf eines Buffer-Overflow-Exploits. Lesen Sie die Codedateien und vergleichen Sie sie mit dieser Erklärung, um Ihr Verständnis zu festigen.
Dieses Beispiel dient nur zu Lernzwecken. Verwenden Sie diese Technik nicht gegen Systeme, die Ihnen nicht gehören oder für deren Test Sie keine ausdrückliche Erlaubnis haben. Unbefugter Zugriff auf Computersysteme ist illegal.