.. | ||
ret2win | ||
stack-shellcode | ||
pointer-redirecting.md | ||
README.md | ||
ret2win.md | ||
stack-pivoting-ebp2ret-ebp-chaining.md | ||
stack-shellcode.md | ||
uninitialized-variables.md |
Stack Overflow
{% hint style="success" %}
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Check the subscription plans!
- Join the 💬 Discord group or the telegram group or follow us on Twitter 🐦 @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.
Š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 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:
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:
{% content-ref url="ret2win/" %} ret2win {% endcontent-ref %}
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:
{% content-ref url="stack-shellcode/" %} stack-shellcode {% endcontent-ref %}
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:
{% content-ref url="../rop-return-oriented-programing/" %} rop-return-oriented-programing {% endcontent-ref %}
Heap Overflows
Overflow se ne mora uvek dešavati u steku, može se takođe desiti u heap-u na primer:
{% content-ref url="../libc-heap/heap-overflow.md" %} heap-overflow.md {% endcontent-ref %}
Tipovi zaštita
Postoji nekoliko zaštita koje pokušavaju da spreče eksploataciju ranjivosti, proverite ih u:
{% content-ref url="../common-binary-protections-and-bypasses/" %} common-binary-protections-and-bypasses {% endcontent-ref %}
{% hint style="success" %}
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ška HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitter-u 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.