Stack Overflow
Reading time: 5 minutes
tip
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)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.
Šta je Stack Overflow
A 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 š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 vrednosti 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 da prepiše druge delove steka.
Neke uobičajene funkcije koje su ranjive na ovo su: strcpy
, strcat
, sprintf
, gets
... Takođe, funkcije kao što su 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:
void vulnerable() {
char buffer[128];
printf("Enter some text: ");
gets(buffer); // This is where the vulnerability lies
printf("You entered: %s\n", buffer);
}
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.
Pored toga, kada pronađete da postoji ranjivost 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 kontiguitetna 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:
from pwn import *
# Generate a De Bruijn sequence of length 1000 with an alphabet size of 256 (byte values)
pattern = cyclic(1000)
# This is an example value that you'd have found in the EIP/IP register upon crash
eip_value = p32(0x6161616c)
offset = cyclic_find(eip_value) # Finds the offset of the sequence in the De Bruijn pattern
print(f"The offset is: {offset}")
ili GEF:
#Patterns
pattern create 200 #Generate length 200 pattern
pattern search "avaaawaa" #Search for the offset of that substring
pattern search $rsp #Search the offset given the content of $rsp
Iskorišćavanje Stack Overflow-a
Tokom overflow-a (pretpostavljajući da je veličina overflow-a dovoljno velika) moći ćete da prepišete vrednosti lokalnih promenljivih unutar steka sve 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, tok kontrole će biti preusmeren gde god korisnik odredi u ovom 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 ASLR će biti onemogućen) tako da kada ranjiva funkcija vrati, skrivena funkcija će biti pozvana:
Stack 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:
ROP & 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 Programing
Heap Overflows
Overflow ne mora uvek biti u steku, može biti i u heap-u na primer:
Tipovi zaštita
Postoji nekoliko zaštita koje pokušavaju da spreče eksploataciju ranjivosti, proverite ih u:
Common Binary Exploitation Protections & Bypasses
tip
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)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.