hacktricks/binary-exploitation/stack-overflow
2024-04-19 14:50:14 +00:00
..
ret2win Translated ['binary-exploitation/heap/README.md', 'binary-exploitation/h 2024-04-10 15:34:37 +00:00
stack-shellcode Translated ['binary-exploitation/heap/README.md', 'binary-exploitation/h 2024-04-10 15:34:37 +00:00
pointer-redirecting.md Translated ['README.md', 'binary-exploitation/arbitrary-write-2-exec/aw2 2024-04-07 04:42:46 +00:00
README.md Translated ['binary-exploitation/heap/README.md', 'binary-exploitation/h 2024-04-10 15:34:37 +00:00
ret2win.md Translated ['README.md', 'binary-exploitation/arbitrary-write-2-exec/aw2 2024-04-07 04:42:46 +00:00
stack-pivoting-ebp2ret-ebp-chaining.md Translated ['binary-exploitation/stack-overflow/stack-pivoting-ebp2ret-e 2024-04-19 14:50:14 +00:00
stack-shellcode.md Translated ['README.md', 'binary-exploitation/arbitrary-write-2-exec/aw2 2024-04-07 04:42:46 +00:00
uninitialized-variables.md Translated ['binary-exploitation/heap/README.md', 'binary-exploitation/h 2024-04-10 15:34:37 +00:00

Prekoračenje steka

Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!

Drugi načini podrške HackTricks-u:

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

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

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

{% content-ref url="ret2win/" %} ret2win {% endcontent-ref %}

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

{% 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: 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:

{% content-ref url="../rop-return-oriented-programing/" %} rop-return-oriented-programing {% endcontent-ref %}

Preplavljenosti hipa

Preplavljenost ne mora uvek biti u steku, može biti i u hipu na primer:

{% content-ref url="../heap/heap-overflow.md" %} heap-overflow.md {% endcontent-ref %}

Vrste zaštita

Postoje različite zaštite koje pokušavaju da spreče iskorišćavanje ranjivosti, proverite ih u:

{% content-ref url="../common-binary-protections-and-bypasses/" %} common-binary-protections-and-bypasses {% endcontent-ref %}