SROP - Sigreturn-Oriented Programming
Grundlegende Informationen
Sigreturn
ist ein spezieller Syscall, der hauptsächlich verwendet wird, um nach Abschluss eines Signalhandlers aufzuräumen. Signale sind Unterbrechungen, die vom Betriebssystem an ein Programm gesendet werden, oft um anzuzeigen, dass eine außergewöhnliche Situation aufgetreten ist. Wenn ein Programm ein Signal empfängt, unterbricht es vorübergehend seine aktuelle Arbeit, um das Signal mit einem Signalhandler, einer speziellen Funktion, die für den Umgang mit Signalen entwickelt wurde, zu verarbeiten.
Nachdem der Signalhandler fertig ist, muss das Programm seinen vorherigen Zustand wiederherstellen, als ob nichts passiert wäre. Hier kommt sigreturn
ins Spiel. Es hilft dem Programm, aus dem Signalhandler zurückzukehren und stellt den Zustand des Programms wieder her, indem es den Stackframe aufräumt (den Abschnitt des Speichers, der Funktionsaufrufe und lokale Variablen speichert), der vom Signalhandler verwendet wurde.
Der interessante Teil ist, wie sigreturn
den Zustand des Programms wiederherstellt: Es speichert alle Registerwerte der CPU auf dem Stack. Wenn das Signal nicht mehr blockiert ist, sigreturn
poppt diese Werte vom Stack ab, wodurch die Register der CPU effektiv auf ihren Zustand vor der Signalverarbeitung zurückgesetzt werden. Dies beinhaltet das Stackzeigerregister (RSP), das auf den aktuellen oberen Teil des Stacks zeigt.
Durch Aufrufen des Syscalls sigreturn
aus einer ROP-Kette und Hinzufügen der Registrierungswerte, die wir möchten, dass sie im Stack geladen werden, ist es möglich, alle Registerwerte zu kontrollieren und somit beispielsweise den Syscall execve
mit /bin/sh
aufzurufen.
Beachten Sie, dass dies eine Art von Ret2syscall wäre, die es viel einfacher macht, Parameter zu steuern, um andere Ret2syscalls aufzurufen:
pageRet2syscallWenn Sie neugierig sind, handelt es sich hierbei um die sigcontext-Struktur, die im Stack gespeichert ist, um die Werte später wiederherzustellen (Diagramm von hier):
Für eine bessere Erklärung siehe auch:
Beispiel
Sie können hier ein Beispiel finden, wo der Aufruf von signeturn über ROP konstruiert wird (wobei in rxa der Wert 0xf
eingefügt wird), obwohl dies der endgültige Exploit von dort ist:
Überprüfen Sie auch das Exploit von hier, wo das Binärprogramm bereits sigreturn
aufgerufen hat und daher kein ROP erstellt werden muss:
Weitere Beispiele & Referenzen
Assembler-Binärdatei, die es ermöglicht, auf den Stack zu schreiben und dann den
sigreturn
-Syscall aufzurufen. Es ist möglich, auf dem Stack eine ret2syscall über eine sigreturn-Struktur zu schreiben und die Flagge zu lesen, die sich im Speicher der Binärdatei befindet.Assembler-Binärdatei, die es ermöglicht, auf den Stack zu schreiben und dann den
sigreturn
-Syscall aufzurufen. Es ist möglich, auf dem Stack eine ret2syscall über eine sigreturn-Struktur zu schreiben (die Binärdatei enthält den String/bin/sh
).64 Bit, kein relro, kein Canary, nx, kein pie. Einfacher Pufferüberlauf, der die
gets
-Funktion ausnutzt, ohne Gadgets, die ein ret2syscall durchführen. Die ROP-Kette schreibt/bin/sh
in den.bss
, indem sie erneutgets
aufruft, missbraucht diealarm
-Funktion, um eax auf0xf
zu setzen, um einen SROP aufzurufen und eine Shell auszuführen.64-Bit-Assemblerprogramm, kein relro, kein Canary, nx, kein pie. Der Ablauf ermöglicht das Schreiben in den Stack, die Kontrolle mehrerer Register und das Aufrufen eines Syscalls, der dann
exit
aufruft. Der ausgewählte Syscall ist einsigreturn
, der Register setzt undeip
bewegt, um eine vorherige Syscall-Anweisung aufzurufen undmemprotect
auszuführen, um den Binärraum aufrwx
zu setzen und den ESP im Binärraum zu setzen. Im weiteren Verlauf ruft das Programm erneut read in ESP auf, aber in diesem Fall zeigt ESP auf die nächste Anweisung, sodass beim Übergeben eines Shellcodes dieser als nächste Anweisung geschrieben und ausgeführt wird.SROP wird verwendet, um Ausführungsberechtigungen (memprotect) für den Ort zu geben, an dem ein Shellcode platziert wurde.
Last updated