Stack Overflow
Šta je prekoračenje steka
Prekoračenje steka je ranjivost koja se javlja kada program upisuje više podataka na stek nego što je alociran da drži. Višak podataka će prepisati susedni memorijski prostor, što dovodi do korupcije validnih podataka, poremećaja kontrolnog toka i potencijalno izvršavanja zlonamernog koda. Ovaj problem često nastaje zbog korišćenja nesigurnih funkcija koje ne vrše proveru granica ulaza.
Glavni problem ovog prepisivanja je što su sačuvani pokazivač instrukcije (EIP/RIP) i sačuvani bazni pokazivač (EBP/RBP) za povratak na prethodnu funkciju sačuvani na steku. Stoga, napadač će moći da prepisuje te vrednosti i kontroliše izvršavanje programa.
Ranjivost obično nastaje jer funkcija kopira unutar steka više bajtova nego što je alocirano za nju, te može prepisati druge delove steka.
Neke uobičajene funkcije koje su ranjive na ovo su: strcpy
, strcat
, sprintf
, gets
... Takođe, funkcije poput fgets
, read
& memcpy
koje uzimaju argument dužine, mogu biti korišćene na ranjiv način ako je navedena dužina veća od alocirane.
Na primer, sledeće funkcije mogu biti ranjive:
Pronalaženje ofseta preplavljivanja steka
Najčešći način pronalaženja preplavljivanja steka je unošenje vrlo velikog unosa A
(npr. python3 -c 'print("A"*1000)'
) i očekivanje Segmentation Fault
koji ukazuje da je pokušano pristupanje adresi 0x41414141
.
Osim toga, kada otkrijete da postoji ranjivost preplavljivanja steka, moraćete pronaći ofset dok je moguće prepisati povratnu adresu, za to se obično koristi De Bruijn sekvencija. Za dati alfabet veličine k i podnizove dužine n, De Bruijn sekvencija je ciklična sekvencija u kojoj se svaki mogući podniz dužine n pojavljuje tačno jednom kao kontinuirani podniz.
Na ovaj način, umesto da ručno određujete koji ofset je potreban da biste kontrolisali EIP, moguće je koristiti jednu od ovih sekvenci kao punjenje, a zatim pronaći ofset bajtova koji su završili prepisivanjem.
Moguće je koristiti pwntools za ovo:
ili GEF:
Iskorišćavanje preplavljenosti steka
Tokom preplavljenosti (pretpostavljajući da je veličina preplavljenosti dovoljno velika) moći ćete da prepišete vrednosti lokalnih promenljivih unutar steka sve do dostizanja sačuvanog EBP/RBP i EIP/RIP (ili čak više). Najčešći način zloupotrebe ovog tipa ranjivosti je menjanje adrese povratka tako da kada funkcija završi, tok kontrole će biti preusmeren gde god je korisnik odredio u ovom pokazivaču.
Međutim, u drugim scenarijima možda će biti dovoljno za iskorišćavanje samo prepisivanje vrednosti nekih promenljivih u steku (kao u jednostavnim CTF izazovima).
Ret2win
U ovom tipu CTF izazova, postoji funkcija unutar binarnog fajla koja nikada nije pozvana i koju morate pozvati da biste pobedili. Za ove izazove samo treba da pronađete pomeraj za prepisivanje adrese povratka i pronađete adresu funkcije koju treba pozvati (obično će biti onemogućen ASLR) tako da kada ranjiva funkcija završi, skrivena funkcija će biti pozvana:
pageRet2winShellkod na steku
U ovom scenariju napadač može postaviti shellkod na stek i zloupotrebiti kontrolisani EIP/RIP da skoči na shellkod i izvrši proizvoljni kod:
pageStack ShellcodeROP & Ret2... tehnike
Ova tehnika je osnovni okvir za zaobilaženje glavne zaštite prethodne tehnike: Neizvršivi stek (NX). I omogućava izvođenje nekoliko drugih tehnika (ret2lib, ret2syscall...) koje će na kraju izvršiti proizvoljne komande zloupotrebom postojećih instrukcija u binarnom fajlu:
pageROP - Return Oriented ProgramingPreplavljenosti hipa
Preplavljenost ne mora uvek biti u steku, može biti i u hipu na primer:
pageHeap OverflowVrste zaštita
Postoje različite zaštite koje pokušavaju da spreče iskorišćavanje ranjivosti, proverite ih u:
pageCommon Binary Exploitation Protections & BypassesLast updated