Stack Overflow
Šta je Stack Overflow
Stack overflow je ranjivost koja se javlja kada program upisuje više podataka na stek nego što je dodeljeno da drži. Ovi viškovi podataka će prepisati susedni memorijski prostor, što dovodi do korupcije validnih podataka, prekida kontrolnog toka i potencijalno izvršavanja zlonamernog koda. Ovaj problem često nastaje zbog korišćenja nesigurnih funkcija koje ne vrše proveru granica na ulazu.
Glavni problem ovog prepisivanja je što su sačuvani pokazivač instrukcija (EIP/RIP) i sačuvani osnovni pokazivač (EBP/RBP) za vraćanje na prethodnu funkciju smešteni na steku. Stoga, napadač će moći da prepiše te pokazivače i kontroliše tok izvršavanja programa.
Ranjivost obično nastaje jer funkcija kopira više bajtova unutar steka nego što je dodeljeno za nju, čime može prepisati druge delove steka.
Neke uobičajene funkcije ranjive na ovo su: strcpy
, strcat
, sprintf
, gets
... Takođe, funkcije poput fgets
, read
& memcpy
koje uzimaju argument dužine, mogu se koristiti na ranjiv način ako je navedena dužina veća od dodeljene.
Na primer, sledeće funkcije bi mogle biti ranjive:
Pronalaženje offseta za Stack Overflow
Najčešći način za pronalaženje stack overflow-a je davanje veoma velikog unosa A
s (npr. python3 -c 'print("A"*1000)'
) i očekivanje Segmentation Fault
koji ukazuje da je adresu 0x41414141
pokušano pristupiti.
Štaviše, kada otkrijete da postoji ranjivost na Stack Overflow, biće potrebno pronaći offset do trenutka kada je moguće prepisati adresu povratka, za to se obično koristi De Bruijn sekvenca. Koja za dati alfabet veličine k i podsekvence dužine n predstavlja cikličnu sekvencu u kojoj se svaka moguća podsekvenca dužine _n_** pojavljuje tačno jednom** kao kontigenta podsekvenca.
Na ovaj način, umesto da ručno otkrivate koji offset je potreban za kontrolu EIP-a, moguće je koristiti kao punjenje jednu od ovih sekvenci i zatim pronaći offset bajtova koji su završili prepisivanje.
Moguće je koristiti pwntools za ovo:
или GEF:
Iskorišćavanje Stack Overflows
Tokom overflow-a (pretpostavljajući da je veličina overflow-a dovoljno velika) moći ćete da prepišete vrednosti lokalnih promenljivih unutar steka dok ne dođete do sačuvanih EBP/RBP i EIP/RIP (ili čak više). Najčešći način zloupotrebe ove vrste ranjivosti je modifikacija adrese povratka tako da kada funkcija završi, kontrolni tok će biti preusmeren gde god korisnik odredi u ovoj pokazivaču.
Međutim, u drugim scenarijima možda će samo prepisivanje nekih vrednosti promenljivih u steku biti dovoljno za eksploataciju (kao u lakim CTF izazovima).
Ret2win
U ovom tipu CTF izazova, postoji funkcija unutar binarnog fajla koja se nikada ne poziva i koju morate pozvati da biste pobedili. Za ove izazove samo treba da pronađete offset za prepisivanje adrese povratka i pronađete adresu funkcije koju treba pozvati (obično bi ASLR bio onemogućen) tako da kada se ranjiva funkcija vrati, skrivena funkcija će biti pozvana:
Ret2winStack Shellcode
U ovom scenariju napadač može postaviti shellcode u stek i zloupotrebiti kontrolisani EIP/RIP da skoči na shellcode i izvrši proizvoljan kod:
Stack ShellcodeROP & Ret2... tehnike
Ova tehnika je osnovni okvir za zaobilaženje glavne zaštite prethodne tehnike: No executable stack (NX). I omogućava izvođenje nekoliko drugih tehnika (ret2lib, ret2syscall...) koje će završiti izvršavanjem proizvoljnih komandi zloupotrebom postojećih instrukcija u binarnom fajlu:
ROP - Return Oriented ProgramingHeap Overflows
Overflow se ne mora uvek dešavati u steku, može se takođe desiti u heap-u na primer:
Heap OverflowTipovi zaštita
Postoji nekoliko zaštita koje pokušavaju da spreče eksploataciju ranjivosti, proverite ih u:
Common Binary Exploitation Protections & BypassesLast updated