Skip to content
KitploitKITPLOIT
ToolsBlog
Einreichen
ToolsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

··Feeds·Kontakt·Datenschutz·© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
CVE-2019-25485 — Stack-basierter Pufferüberlauf in R 3.4.4. Vollständige Exploitation auf x86, aber auf x64 nur RIP-Kontrolle mit Gadget-Analyse aufgrund von Programmbeschränkungen. Dieselbe Schwachstelle auf zwei Architekturen führt zu unterschiedlichen Exploitationspfaden. | Kitploit
Tools/GitHubGitHub/themalwareguardian/cve-2019-25485
SchwachstellenanalyseExploitationReverse EngineeringShellcodeDebuggerLernen & BildungPayload-EntwicklungBinary-Exploitation

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen
GitHub
themalwareguardian/cve-2019-25485

CVE-2019-25485

Stack-basierter Pufferüberlauf in R 3.4.4. Vollständige Exploitation auf x86, aber auf x64 nur RIP-Kontrolle mit Gadget-Analyse aufgrund von Programmbeschränkungen. Dieselbe Schwachstelle auf zwei Architekturen führt zu unterschiedlichen Exploitationspfaden.

Repository anzeigen
vor 4 MonatenNoch nicht geprüft

🐞 CVE-2019-25485: R 3.4.4 - Stack-basierter Pufferüberlauf (x86 und x64)

Stack-basierter Pufferüberlauf in R 3.4.4. Vollständige Ausnutzung auf x86, aber nur RIP-Kontrolle mit Gadget-Analyse auf x64 aufgrund von Programmrestriktionen. Dieselbe Schwachstelle auf zwei Architekturen, die zu unterschiedlichen Ausnutzungspfaden führt.




📑 Inhaltsverzeichnis

  • Warum dieses Repository existiert
  • Warum diese Schwachstelle interessant ist
  • Kontext und betroffene Software
  • Über die Schwachstelle
  • Auslösen des Absturzes
  • Ausnutzung



🎓 Warum dieses Repository existiert

Dieses Repository ist Teil des Materials, das ich beim Unterrichten von Memory-Corruption-Exploitation verwende (zusätzlich zu meiner regulären Arbeit unterrichte ich auch in verschiedenen Cybersicherheitskursen, wo ich helfe, die nächste Generation von Reverse Engineers auszubilden).

CVE-2019-25485 ist der Fall, den ich verwende, wenn ich möchte, dass Studenten dieselbe Schwachstelle auf zwei verschiedenen Architekturen durcharbeiten und aus erster Hand sehen, was sich zwischen ihnen ändert. R 3.4.4 wird sowohl in x86- als auch in x64-Versionen ausgeliefert, und in beiden existiert exakt derselbe Überlauf, dasselbe GUI-Feld, derselbe Eingabe-Handler, derselbe Absturz. Beide sind hier als separate Übungen dokumentiert und ausgenutzt:

  • Die x86-Version folgt der klassischen Vanilla-EIP-Overwrite-Methodik. Der Überlauf erreicht EIP, ein JMP-ESP-Gadget wird in einem Modul ohne ASLR gefunden, Shellcode wird nach dem EIP-Overwrite platziert, und eine funktionierende Reverse Shell wird erreicht. Es ist ein sauberer und direkter Exploit, der die Grundlagen von Stack-basierten Pufferüberläufen demonstriert.
  • Die x64-Version erreicht RIP-Kontrolle und bestätigt den Offset, aber vollständige RCE wird nicht erreicht. Das ist beabsichtigt und der Punkt der Übung. Der x64-Ausnutzungsversuch dokumentiert den Gadget-Suchprozess vollständig, analysiert, warum jede Gadget-Kategorie in diesem spezifischen Kontext fehlschlägt, erklärt die durch den Eingabe-Handler auferlegte Null-Byte-Beschränkung und beschreibt die ROP-Chain-Struktur, die notwendig wäre, um DEP zu umgehen, und warum sie angesichts der Einschränkungen dieses Eingabevektors nicht gebaut werden kann. Der einzige verbleibende theoretische Pfad zur vollständigen Ausnutzung dieser einzelnen Schwachstelle wäre JOP, Jump-Oriented Programming, das Gadgets verkettet, die mit JMP statt RET enden und sich für den Kontrollfluss nicht auf den Stack verlässt. Das manuelle Konstruieren einer JOP-Chain ohne einen beschreibbaren kontrollierten Bereich nach dem RIP-Overwrite ist eine fortgeschrittene offene Herausforderung, die über den Rahmen dieser Übung hinausgeht. Das Scheitern ist keine Lücke in der Methodik. Es ist die Lektion.



💡 Warum diese Schwachstelle interessant ist

R 3.4.4 ist eine statistische Rechenanwendung, kein Netzwerkdienst und kein Browser. Der Überlauf wird über ein Desktop-GUI-Feld ausgelöst, was bedeutet, dass die Angriffsfläche völlig anders ist als bei jedem anderen Fall, den ich unterrichte. Was diesen Fall für den Unterricht nützlich macht:

  • Keine Netzkomponente. Das Payload wird in ein GUI-Feld eingefügt, was eine andere Klasse von Einschränkungen mit sich bringt, insbesondere wie der GUI-Eingabe-Handler Bytes verarbeitet, bevor sie die verwundbare Kopieroperation erreichen.
  • RIP-Kontrolle ist bestätigt. Der Überlauf erreicht RIP und der Offset wird gefunden. Dies ist kein Fall, in dem die Schwachstelle nicht erreicht werden kann. Die Kontrolle über den Instruction Pointer wird vollständig demonstriert.
  • Die Durchsetzung kanonischer Adressen bricht den klassischen Ansatz. Auf x86 überschreibst du EIP und hängst Shellcode an. Auf x64 müssen die oberen Bytes von RIP \x00\x00 sein, damit die Adresse kanonisch ist, und diese Null-Bytes beenden die Eingabe unmittelbar nach der Gadget-Adresse. Es gibt keinen Platz für Shellcode oder ROP-Chain-Werte nach dem Overwrite.
  • Null-Byte-Konvertierung blockiert ROP. Das GUI-Feld konvertiert Null-Bytes in Leerzeichen, bevor es in den Puffer kopiert. Jede x64-Adresse enthält Null-Bytes in der oberen Hälfte. Keine Gadget-Adresse kann als ROP-Chain-Wert auf dem Stack platziert werden, sie kommen alle korrupt an.
  • DEP blockiert direkte Ausführung. Selbst wenn ein Weg gefunden würde, den Shellcode-Puffer zu erreichen, wird DEP durchgesetzt und blockiert die Ausführung auf dem Stack.
  • Gadget-Suche ist vollständig dokumentiert. Der Prozess des Dumpens von Gadgets aus jedem geladenen Modul, das Filtern nach Typ und die Überlegung, warum jedes Gadget fehlschlägt, ist Schritt für Schritt dokumentiert. Dies ist die Kernkompetenz, die jeder Exploit-Entwickler benötigt.
  • Das ROP-Chain-Gerüst für VirtualProtect wird erklärt. Studenten sehen genau, was nötig wäre, um DEP zu umgehen, warum die Aufrufkonvention wichtig ist und warum diese spezifische Chain angesichts der Eingabebeschränkungen nicht gebaut werden kann.



Tool herunterladen

🔍 Kontext und betroffene Software

R ist eine statistische Rechen- und Grafikumgebung, die für Windows, macOS und Linux verfügbar ist. Die Schwachstelle befindet sich im GUI-Präferenzen-Dialog, genauer gesagt im Feld Sprache für Menüs und Meldungen, das Benutzereingaben ohne Längenprüfung in einen Stack-Puffer fester Größe kopiert.

Wichtige technische Details:

  • Schwachstellentyp: Stack-basierter Pufferüberlauf
  • Betroffene Version: R 3.4.4 x86_x64
  • Betroffener Endpunkt: Bearbeiten -> GUI-Einstellungen -> Sprache für Menüs und Meldungen
  • Verwundbare Komponente: Eingabe-Handler der GUI-Einstellungen
  • Erforderliche Authentifizierung: Nein (lokale Anwendung)
  • Auswirkung: x86 - Remote-Codeausführung | x64 - Kontrollfluss bestätigt



⚠️ Über die Schwachstelle

R 3.4.4 verarbeitet das Feld Sprache für Menüs und Meldungen, indem es die bereitgestellte Zeichenfolge ohne Längenprüfung in einen Stack-Puffer fester Größe kopiert. Eine vereinfachte Version der verwundbaren Logik sieht wie folgt aus:

root@kitploit:~
char language_buffer[256];

strcpy(language_buffer, user_input);

Das Senden einer ausreichend langen Zeichenfolge führt dazu, dass die Kopie über das Ende des Puffers hinausschreibt und den Stack korrumpiert, bis die gespeicherte Rücksprungadresse überschrieben wird. Wenn die Funktion zurückkehrt, lädt die CPU den vom Angreifer kontrollierten Wert vom Stack in RIP und versucht, dorthin zu springen.

Auf x64 erzwingt Windows die Validierung kanonischer Adressen, bevor ein Sprung stattfindet. Ein nicht-kanonischer Wert wie 0x4141414141414141 löst eine sofortige Zugriffsverletzung aus, bevor RIP geladen wird, was bedeutet, dass der Absturz anders aussieht als auf x86, kein sauberes RIP = 4141414141414141. Der Offset muss gefunden werden, indem das zyklische Muster nach dem Absturz vom Stack gelesen wird, anstatt direkt aus RIP.




💥 Auslösen des Absturzes

Der Absturz kann reproduziert werden, indem eine lange Zeichenfolge in das Sprachfeld eingefügt wird. Keine Authentifizierung erforderlich. Beispiel mit Python zum Generieren des Payloads:

root@kitploit:~
import struct

payload = b'A' * 400

with open('payload.txt', 'wb') as f:
	f.write(payload)
root@kitploit:~
Open R 3.4.4 x64
Edit -> GUI Preferences
Paste contents of payload.txt into Language for menus and messages
Click OK



💣 Ausnutzung

Das Ziel dieses Repository ist es nicht nur, den Absturz zu demonstrieren, sondern den vollständigen Ausnutzungsprozess auf beiden Architekturen durchzugehen und zu dokumentieren, was auf x86 funktioniert, was auf x64 bricht und, was noch wichtiger ist, warum.

Um die Haupt-README übersichtlich zu halten, befinden sich die detaillierten Ausnutzungsnotizen, Skripte und Debugger-Schritte im Ordner Vulnerability 📂 dieses Repositorys, organisiert in separate x86- und x64-Unterordner.

Dort finden Sie den vollständigen Arbeitsablauf für beide Architekturen:

x86 - Vollständige Ausnutzung:

  • Fuzzing des Sprachfelds, um den Absturz zu identifizieren.
  • Offset-Ermittlung, um die genaue Position von EIP auf dem Stack zu lokalisieren.
  • Bad-Character-Analyse, um Bytes zu identifizieren, die das Payload korrumpieren.
  • Lokalisierung eines JMP-ESP-Gadgets in stats.dll, einem Modul, das ohne ASLR oder SafeSEH kompiliert wurde.
  • Platzierung und Ausführung von Shellcode, vollständige Reverse Shell erreicht.

x64 - RIP-Kontrolle und Ausnutzungsanalyse:

  • Konfiguration von x64dbg, um ständige Unterbrechungen durch DLL-Ladeereignisse zu vermeiden.
  • Fuzzing des Sprachfelds über drei Phasen, um die genaue Absturzgröße zu finden.
  • Ermittlung des RIP-Offsets, indem das zyklische Muster vom Stack statt aus RIP gelesen wird.
  • Bestätigung der RIP-Kontrolle mittels eines 6-Byte-Overwrites mit automatischer Null-Byte-Auffüllung.
  • Identifizierung der Umwandlung von Null-Bytes in Leerzeichen als grundlegende Eingabebeschränkung.
  • Dumping von Gadgets aus allen geladenen R-Modulen mit rp++ und Filtern mit PowerShell.
  • Analyse jeder Gadget-Kategorie, CALL RBX, CALL RSP, POP RSP, SUB RSP, PUSH RSP, und Dokumentation, warum jede in diesem spezifischen Kontext fehlschlägt.
  • Erklärung der ROP-Chain-Struktur, die erforderlich ist, um VirtualProtect aufzurufen und DEP zu umgehen, und warum sie angesichts der Null-Byte-Beschränkung nicht gebaut werden kann.
  • Dokumentation von JOP als einzig verbleibendem theoretischem Pfad und warum es eine offene Herausforderung bleibt.