SROP - Sigreturn-Oriented Programming
Grundinformationen
Sigreturn
ist ein spezieller Syscall, der hauptsächlich verwendet wird, um nach der Ausführung 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 erhält, pausiert es vorübergehend seine aktuelle Arbeit, um das Signal mit einem Signalhandler zu behandeln, einer speziellen Funktion, die dafür ausgelegt ist, mit Signalen umzugehen.
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, vom Signalhandler zurückzukehren und stellt den Zustand des Programms wieder her, indem es den Stackrahmen (den Abschnitt des Speichers, der Funktionsaufrufe und lokale Variablen speichert) aufräumt, der vom Signalhandler verwendet wurde.
Der interessante Teil ist, wie sigreturn
den Zustand des Programms wiederherstellt: Es geschieht, indem alle Registerwerte der CPU auf dem Stack gespeichert werden. Wenn das Signal nicht mehr blockiert ist, poppt sigreturn
diese Werte vom Stack, wodurch die Register der CPU effektiv auf ihren Zustand vor der Signalbehandlung zurückgesetzt werden. Dazu gehört das Stackzeigerregister (RSP), das auf die aktuelle Spitze des Stacks zeigt.
Das Aufrufen des Syscalls sigreturn
aus einer ROP-Kette und das Hinzufügen der Registerwerte, die wir im Stack laden möchten, ermöglicht es, alle Registerwerte zu steuern und daher zum Beispiel den Syscall execve
mit /bin/sh
aufzurufen.
Beachte, dass dies eine Art von Ret2syscall wäre, die es viel einfacher macht, Parameter zu steuern, um andere Ret2syscalls aufzurufen:
Ret2syscallWenn du neugierig bist, hier ist die sigcontext-Struktur, die im Stack gespeichert wird, um später die Werte wiederherzustellen (Diagramm von hier):
Für eine bessere Erklärung siehe auch:
Beispiel
Du kannst ein Beispiel hier finden, wo der Aufruf von signeturn über ROP konstruiert wird (indem der Wert 0xf
in rxa eingegeben wird), obwohl dies der endgültige Exploit von dort ist:
Überprüfen Sie auch den Exploit von hier, wo die Binärdatei bereits sigreturn
aufgerufen hat und es daher nicht erforderlich ist, dies mit einem ROP zu erstellen:
Weitere Beispiele & Referenzen
Assembly-Binärdatei, die es ermöglicht, in den Stack zu schreiben und dann den
sigreturn
syscall aufzurufen. Es ist möglich, einen ret2syscall über eine sigreturn-Struktur auf den Stack zu schreiben und das Flag zu lesen, das sich im Speicher der Binärdatei befindet.Assembly-Binärdatei, die es ermöglicht, in den Stack zu schreiben und dann den
sigreturn
syscall aufzurufen. Es ist möglich, einen ret2syscall über eine sigreturn-Struktur zu schreiben (die Binärdatei enthält die Zeichenkette/bin/sh
).64 Bit, kein relro, kein canary, nx, kein pie. Einfacher Buffer Overflow, der die
gets
-Funktion ausnutzt, mit einem Mangel an Gadgets, die einen ret2syscall ausführen. Die ROP-Kette schreibt/bin/sh
in die.bss
, indem siegets
erneut aufruft, sie missbraucht diealarm
-Funktion, um eax auf0xf
zu setzen, um ein SROP aufzurufen und eine Shell auszuführen.64-Bit-Assembly-Programm, kein relro, kein canary, nx, kein pie. Der Fluss ermöglicht es, in den Stack zu schreiben, mehrere Register zu steuern und einen syscall aufzurufen, und dann wird
exit
aufgerufen. Der ausgewählte syscall ist einsigreturn
, der Register setzen undeip
verschieben wird, um eine vorherige syscall-Anweisung aufzurufen undmemprotect
auszuführen, um den Binärspeicher aufrwx
zu setzen und den ESP im Binärspeicher zu setzen. Folgt man dem Fluss, wird das Programmread
erneut in den ESP aufrufen, aber in diesem Fall wird der ESP auf die nächste Anweisung zeigen, sodass das Übergeben eines Shellcodes es als die nächste Anweisung schreiben und ausführen wird.SROP wird verwendet, um Ausführungsprivilegien (memprotect) an den Ort zu geben, an dem ein Shellcode platziert wurde.
Last updated