Return-Oriented Programming
Auch bekannt als:ROP · Rücksprungorientierte Programmierung
Return-Oriented Programming: Exploit-Technik, die vorhandene Codeschnipsel verkettet, statt eigenen Code einzuschleusen. ROP ist die Standardantwort auf nicht ausführbaren Speicher und damit ein Kernbaustein moderner Binary ExploitationBinary ExploitationAusnutzung von Speicher- oder Logikfehlern in kompilierten Anwendungen..
Funktionsweise und Einordnung
Wenn der Stack nicht mehr ausführbar ist, kann kein ShellcodeShellcodeKompakter Maschinencode, der nach erfolgreicher Ausnutzung direkt vom Zielprozess ausgeführt wird. mehr eingeschleust werden. ROP dreht das Problem um: Statt neuen Code zu liefern, wird vorhandener Code neu zusammengesetzt. Der Angreifer sucht im Programm und seinen Bibliotheken kurze Instruktionsfolgen, die mit einem ret enden — sogenannte Gadgets. Auf den überschriebenen Stack legt er eine Kette von Gadget-Adressen. Jedes ret springt zum nächsten Glied, sodass der Stack faktisch zum Programm wird. Typische Gadgets laden Register (pop rdi ; ret), korrigieren die Stack-Ausrichtung oder rufen Bibliotheksfunktionen auf.
Bedeutung in der Praxis
ROP setzt Kenntnis der Ladeadressen voraus und ist deshalb eng mit ASLRAddress Space Layout RandomizationSchutzmechanismus, der Speicheradressen zufällig anordnet und Exploits dadurch erschwert. verzahnt: Ohne Adress-Leak fehlt die Basis für die Kette. In der Verteidigung greifen Control-Flow-Integrity-Verfahren, Shadow Stacks und Hardware-Mechanismen wie Intel CET oder ARM Pointer Authentication, die unerwartete Rücksprungziele erkennen. Für die Bewertung eines Befunds ist entscheidend, ob das Zielbinary Gadgets und nutzbare Funktionen selbst mitbringt — statisch gelinkte Programme sind hier besonders ergiebig.
Verwandte Begriffe
- Binary ExploitationBinary ExploitationAusnutzung von Speicher- oder Logikfehlern in kompilierten Anwendungen.: Ausnutzung von Speicher- oder Logikfehlern in kompilierten Anwendungen.
- Buffer OverflowBuffer OverflowSchreiben über die Grenze eines Speicherpuffers hinaus, wodurch benachbarte Daten überschrieben werden.: Schreiben über die Grenze eines Speicherpuffers hinaus, wodurch benachbarte Daten überschrieben werden.
- Address Space Layout RandomizationAddress Space Layout RandomizationSchutzmechanismus, der Speicheradressen zufällig anordnet und Exploits dadurch erschwert.: Schutzmechanismus, der Speicheradressen zufällig anordnet und Exploits dadurch erschwert.
- ShellcodeShellcodeKompakter Maschinencode, der nach erfolgreicher Ausnutzung direkt vom Zielprozess ausgeführt wird.: Kompakter Maschinencode, der nach erfolgreicher Ausnutzung direkt vom Zielprozess ausgeführt wird.