Stack Overflow

Support HackTricks

Š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:

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 As (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:

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}")

или 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 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:

Ret2win

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:

Stack Shellcode

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 se ne mora uvek dešavati u steku, može se takođe desiti u heap-u na primer:

Heap Overflow

Tipovi zaštita

Postoji nekoliko zaštita koje pokušavaju da spreče eksploataciju ranjivosti, proverite ih u:

Common Binary Exploitation Protections & Bypasses
Podrška HackTricks

Last updated