ROP - Return Oriented Programing
Last updated
Last updated
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)
Povratno-Orijentisano Programiranje (ROP) je napredna tehnika eksploatacije koja se koristi za zaobilaženje bezbednosnih mera kao što su No-Execute (NX) ili Data Execution Prevention (DEP). Umesto da se injektuje i izvršava shellcode, napadač koristi delove koda koji su već prisutni u binarnom fajlu ili u učitanim bibliotekama, poznatim kao "gadgets". Svaki gadget obično se završava sa ret
instrukcijom i izvršava malu operaciju, kao što je premestanje podataka između registara ili izvođenje aritmetičkih operacija. Povezivanjem ovih gadgeta, napadač može konstruisati payload za izvođenje proizvoljnih operacija, efikasno zaobilazeći NX/DEP zaštite.
Otimač kontrolnog toka: Prvo, napadač treba da otme kontrolni tok programa, obično iskorišćavanjem buffer overflow-a da bi prepisao sačuvanu adresu povratka na steku.
Povezivanje gadgeta: Napadač pažljivo bira i povezuje gadgete da bi izvršio željene akcije. To može uključivati postavljanje argumenata za poziv funkcije, pozivanje funkcije (npr., system("/bin/sh")
), i rukovanje svim potrebnim čišćenjem ili dodatnim operacijama.
Izvršenje payload-a: Kada ranjiva funkcija vrati, umesto da se vrati na legitimnu lokaciju, počinje da izvršava lanac gadgeta.
Obično se gadgeti mogu pronaći koristeći ROPgadget, ropper ili direktno iz pwntools (ROP).
cdecl: Pozivatelj čisti stek. Argumenti funkcije se stavljaju na stek u obrnutom redosledu (s desna na levo). Argumenti se stavljaju na stek s desna na levo.
stdcall: Slično cdecl, ali je pozvana funkcija odgovorna za čišćenje steka.
Prvo, pretpostavimo da smo identifikovali potrebne gadgete unutar binarnog fajla ili njegovih učitanih biblioteka. Gadgeti koji nas zanimaju su:
pop eax; ret
: Ovaj gadget uzima gornju vrednost steka i stavlja je u EAX
registar, a zatim se vraća, omogućavajući nam kontrolu nad EAX
.
pop ebx; ret
: Slično prethodnom, ali za EBX
registar, omogućavajući kontrolu nad EBX
.
mov [ebx], eax; ret
: Premesti vrednost iz EAX
u memorijsku lokaciju na koju pokazuje EBX
, a zatim se vraća. Ovo se često naziva write-what-where gadget.
Pored toga, imamo adresu funkcije system()
dostupnu.
Koristeći pwntools, pripremamo stek za izvršenje ROP lanca na sledeći način, sa ciljem da izvršimo system('/bin/sh')
, primetite kako lanac počinje sa:
ret
instrukcijom za svrhe poravnanja (opciono)
Adresom funkcije system
(pretpostavljajući da je ASLR onemogućen i da je libc poznat, više informacija u Ret2lib)
Mesto za adresu povratka iz system()
Adresom stringa "/bin/sh"
(parametar za funkciju system)
Koristi System V AMD64 ABI konvenciju poziva na Unix-like sistemima, gde se prvih šest celobrojnih ili pokazivačkih argumenata prenosi u registrima RDI
, RSI
, RDX
, RCX
, R8
, i R9
. Dodatni argumenti se prenose na steku. Vraćena vrednost se smešta u RAX
.
Windows x64 konvencija poziva koristi RCX
, RDX
, R8
, i R9
za prva četiri celobrojna ili pokazivačka argumenta, dok se dodatni argumenti prenose na steku. Vraćena vrednost se smešta u RAX
.
Registri: 64-bitni registri uključuju RAX
, RBX
, RCX
, RDX
, RSI
, RDI
, RBP
, RSP
, i R8
do R15
.
Za naše potrebe, fokusiraćemo se na gadgete koji će nam omogućiti da postavimo RDI registar (da prenesemo "/bin/sh" string kao argument za system()) i zatim pozovemo system() funkciju. Pretpostavićemo da smo identifikovali sledeće gadgete:
pop rdi; ret: Uzimanje gornje vrednosti steka u RDI i zatim vraćanje. Osnovno za postavljanje našeg argumenta za system().
ret: Jednostavno vraćanje, korisno za poravnavanje steka u nekim scenarijima.
I znamo adresu system() funkcije.
Ispod je primer korišćenja pwntools za postavljanje i izvršavanje ROP lanca koji ima za cilj da izvrši system('/bin/sh') na x64:
U ovom primeru:
Koristimo pop rdi; ret
gadget da postavimo RDI
na adresu "/bin/sh"
.
Direktno skačemo na system()
nakon postavljanja RDI
, sa adresom system() u lancu.
ret_gadget
se koristi za poravnanje ako ciljno okruženje to zahteva, što je češće u x64 da bi se osiguralo pravilno poravnanje steka pre pozivanja funkcija.
x86-64 ABI osigurava da je stek poravnat na 16 bajtova kada se izvršava call instrukcija. LIBC, da bi optimizovao performanse, koristi SSE instrukcije (kao što je movaps) koje zahtevaju ovo poravnanje. Ako stek nije pravilno poravnat (što znači da RSP nije višekratnik 16), pozivi funkcijama kao što je system će propasti u ROP lancu. Da biste to ispravili, jednostavno dodajte ret gadget pre pozivanja system u vašem ROP lancu.
Pošto x64 koristi registre za prvih nekoliko argumenata, često zahteva manje gadgeta nego x86 za jednostavne pozive funkcija, ali pronalaženje i povezivanje pravih gadgeta može biti složenije zbog povećanog broja registara i većeg adresnog prostora. Povećan broj registara i veći adresni prostor u x64 arhitekturi pružaju i prilike i izazove za razvoj eksploatacija, posebno u kontekstu Programiranja Orijentisanog na Povratak (ROP).
Proverite sledeću stranicu za ove informacije:
Introduction to ARM64v8Stack Canaries: U slučaju BOF-a, potrebno je zaobići skladištenje stack canary da bi se prepisali pokazivači za povratak kako bi se zloupotrebio ROP lanac.
Nedostatak Gadgeta: Ako nema dovoljno gadgeta, neće biti moguće generisati ROP lanac.
Primetite da je ROP samo tehnika za izvršavanje proizvoljnog koda. Na osnovu ROP-a razvijene su mnoge Ret2XXX tehnike:
Ret2lib: Koristite ROP da pozovete proizvoljne funkcije iz učitane biblioteke sa proizvoljnim parametrima (obično nešto poput system('/bin/sh')
.
Ret2Syscall: Koristite ROP da pripremite poziv sistemskoj pozivu, npr. execve
, i izvršite proizvoljne komande.
EBP2Ret & EBP Chaining: Prva će zloupotrebiti EBP umesto EIP da kontroliše tok, a druga je slična Ret2lib, ali u ovom slučaju tok se kontroliše uglavnom sa EBP adresama (iako je takođe potrebno kontrolisati EIP).
64 bita, Pie i nx omogućeni, bez canary, prepisivanje RIP-a sa vsyscall
adresom sa jedinom svrhom da se vrati na sledeću adresu u steku koja će biti delimično prepisivanje adrese da se dobije deo funkcije koji otkriva zastavicu
arm64, bez ASLR, ROP gadget da učini stek izvršivim i skoči na shellcode u steku
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)