Ret2syscall
Grundinformationen
Dies ist ähnlich wie Ret2lib, jedoch werden wir in diesem Fall keine Funktion aus einer Bibliothek aufrufen. In diesem Fall wird alles vorbereitet, um den syscall sys_execve
mit einigen Argumenten aufzurufen, um /bin/sh
auszuführen. Diese Technik wird normalerweise bei statisch kompilierten Binaries durchgeführt, sodass es viele Gadgets und syscall-Anweisungen geben kann.
Um den Aufruf für den syscall vorzubereiten, ist die folgende Konfiguration erforderlich:
rax: 59 Geben Sie sys_execve an
rdi: ptr zu "/bin/sh" geben Sie die auszuführende Datei an
rsi: 0 geben Sie an, dass keine Argumente übergeben werden
rdx: 0 geben Sie an, dass keine Umgebungsvariablen übergeben werden
Im Grunde genommen muss die Zeichenfolge /bin/sh
irgendwo geschrieben werden, und dann muss der syscall
ausgeführt werden (unter Berücksichtigung des benötigten Paddings zur Kontrolle des Stacks). Dafür benötigen wir ein Gadget, um /bin/sh
in einem bekannten Bereich zu schreiben.
Ein weiterer interessanter syscall, den man aufrufen kann, ist mprotect
, der es einem Angreifer ermöglichen würde, die Berechtigungen einer Seite im Speicher zu ändern. Dies kann mit ret2shellcode kombiniert werden.
Register-Gadgets
Lassen Sie uns damit beginnen, wie man diese Register kontrolliert:
Mit diesen Adressen ist es möglich, den Inhalt im Stack zu schreiben und in die Register zu laden.
Zeichenfolge schreiben
Beschreibbarer Speicher
Zuerst müssen Sie einen beschreibbaren Ort im Speicher finden.
Schreiben von Zeichenfolgen im Speicher
Dann müssen Sie einen Weg finden, um beliebige Inhalte an dieser Adresse zu schreiben.
Automatisiere ROP-Kette
Der folgende Befehl erstellt eine vollständige sys_execve
ROP-Kette für eine statische Binärdatei, wenn es Write-What-Where-Gadgets und Syscall-Anweisungen gibt:
32 Bit
64 Bit
Fehlende Gadgets
Wenn Ihnen Gadgets fehlen, um beispielsweise /bin/sh
im Speicher zu schreiben, können Sie die SROP-Technik verwenden, um alle Registerwerte (einschließlich RIP und Parameterregister) vom Stack zu steuern:
Exploit-Beispiel
Weitere Beispiele & Referenzen
64 Bit, kein PIE, nx, schreibe in einen Speicher einen ROP, um
execve
aufzurufen und dorthin zu springen.64 Bit, nx, kein PIE, schreibe in einen Speicher einen ROP, um
execve
aufzurufen und dorthin zu springen. Um in den Stack zu schreiben, wird eine Funktion missbraucht, die mathematische Operationen durchführt.64 Bit, kein PIE, nx, BF Canary, schreibe in einen Speicher einen ROP, um
execve
aufzurufen und dorthin zu springen.
Last updated