Ret2esp / Ret2reg
Last updated
Last updated
Naučite i vežbajte hakovanje AWS-a:HackTricks Training AWS Red Team Expert (ARTE) Naučite i vežbajte hakovanje GCP-a: HackTricks Training GCP Red Team Expert (GRTE)
Zato što ESP (Stack Pointer) uvek pokazuje na vrh steka, ova tehnika uključuje zamenu EIP (Instruction Pointer) adresom jmp esp
ili call esp
instrukcije. Time se shellkod postavlja odmah nakon prepisanog EIP-a. Kada se izvrši ret
instrukcija, ESP pokazuje na sledeću adresu, tačno tamo gde je smešten shellkod.
Ako Address Space Layout Randomization (ASLR) nije omogućen u Windows-u ili Linux-u, moguće je koristiti jmp esp
ili call esp
instrukcije pronađene u deljenim bibliotekama. Međutim, sa ASLR aktivnim, možda ćete morati potražiti ove instrukcije unutar ranjivog programa (i možda ćete morati pobediti PIE).
Osim toga, mogućnost postavljanja shellkoda nakon korupcije EIP-a, umesto u sredini steka, osigurava da bilo koje push
ili pop
instrukcije izvršene tokom rada funkcije ne ometaju shellkod. Do ometanja bi moglo doći ako bi se shellkod postavio u sredinu steka funkcije.
Ako vam nedostaje prostora za pisanje nakon prepisivanja RIP-a (možda samo nekoliko bajtova), napišite početni jmp
shellkod kao:
I napišite shellcode rano na steku.
Možete pronaći primer ove tehnike na https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode/using-rsp sa konačnim eksploatacijom kao:
Možete videti još jedan primer ove tehnike na https://guyinatuxedo.github.io/17-stack_pivot/xctf16_b0verflow/index.html. Postoji prelivanje bafera bez omogućenog NX-a, koristi se gedžet za smanjenje adrese $esp
a zatim jmp esp;
da bi se skočilo na shellcode:
Slično tome, ako znamo da funkcija vraća adresu gde je smešten shell kod, možemo iskoristiti call eax
ili jmp eax
instrukcije (poznate kao tehnika ret2eax), pružajući drugi način za izvršavanje našeg shell koda. Baš kao eax, bilo koji drugi registar koji sadrži zanimljivu adresu može se koristiti (ret2reg).
Možete pronaći neke primere ovde:
strcpy
će smestiti u eax
adresu bafera gde je smešten shell kod i eax
nije prepisan, tako da je moguće koristiti ret2eax
.
U ARM64 nema instrukcija koje omogućavaju skok na SP registar. Možda je moguće pronaći gedžet koji pomeri sp u registar, a zatim skoči na taj registar, ali u libc-u mog Kali-ja nisam mogao pronaći takav gedžet:
Jedini koje sam otkrio bi promenili vrednost registra gde je sp kopiran pre skakanja na njega (tako da bi postao beskoristan):
Ako registar ima zanimljivu adresu, moguće je skočiti na nju pronalaženjem odgovarajuće instrukcije. Mogli biste koristiti nešto poput:
U ARM64, to je x0
koji čuva povratnu vrednost funkcije, tako da bi moglo biti da x0 čuva adresu bafera koji kontroliše korisnik sa shellcode-om za izvršenje.
Primer koda:
Proverom disasemblera funkcije moguće je videti da je adresa bafera (ranjiva na preplavljivanje bafera i kontrolisana od strane korisnika) smeštena u x0
pre povratka iz preplavljivanja bafera:
Takođe je moguće pronaći gedžet br x0
u funkciji do_stuff
:
Iskoristićemo taj gedžet da bismo skočili na njega jer je binarni fajl kompajliran BEZ PIE-a. Korišćenjem obrasca moguće je videti da je ofset preplavljivanja bafera 80, pa bi eksploatacija bila:
Ako umesto fgets
bude korišćeno nešto poput read
, bilo bi moguće zaobići PIE takođe samo prebrisavanjem poslednja 2 bajta povratne adrese da se vrati na instrukciju br x0;
bez potrebe da se zna potpuna adresa.
Sa fgets
to ne funkcioniše jer dodaje nulu (0x00) na kraju.
NX: Ako stek nije izvršiv, ovo neće pomoći jer moramo postaviti shellkod na stek i skočiti da ga izvršimo.
Naučite i vežbajte hakovanje AWS:HackTricks Training AWS Red Team Expert (ARTE) Naučite i vežbajte hakovanje GCP: HackTricks Training GCP Red Team Expert (GRTE)