Ret2esp / Ret2reg
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Pošto ESP (Stack Pointer) uvek pokazuje na vrh steka, ova tehnika uključuje zamenu EIP (Instruction Pointer) sa adresom jmp esp
ili call esp
instrukcije. Na taj način, shellcode se postavlja odmah nakon prepisanog EIP-a. Kada se izvrši ret
instrukcija, ESP pokazuje na sledeću adresu, tačno gde je shellcode smešten.
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 koje se nalaze u deljenim bibliotekama. Međutim, sa aktivnim ASLR, možda će biti potrebno potražiti ove instrukcije unutar same ranjive aplikacije (i možda ćete morati da savladate PIE).
Štaviše, mogućnost postavljanja shellcode-a posle korupcije EIP-a, umesto u sredini steka, osigurava da bilo koje push
ili pop
instrukcije izvršene tokom rada funkcije ne ometaju shellcode. Ova ometanja mogla bi se desiti ako bi shellcode bio postavljen u sredini steka funkcije.
Ako vam nedostaje prostora da pišete nakon prepisivanja RIP-a (možda samo nekoliko bajtova), napišite inicijalni jmp
shellcode 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 eksploatom kao:
Možete videti još jedan primer ove tehnike na https://guyinatuxedo.github.io/17-stack_pivot/xctf16_b0verflow/index.html. Postoji buffer overflow bez omogućene NX, koristi se gadget za smanjenje adrese $esp
i zatim jmp esp;
za skakanje na shellcode:
Slično tome, ako znamo da funkcija vraća adresu na kojoj je smešten shellcode, možemo iskoristiti call eax
ili jmp eax
instrukcije (poznate kao ret2eax tehnika), nudeći još jedan način za izvršavanje našeg shellcode-a. Baš kao i eax, bilo koji drugi registar koji sadrži zanimljivu adresu može se koristiti (ret2reg).
Možete pronaći neke primere ovde:
strcpy
će u eax
sačuvati adresu bafera gde je shellcode bio smešten i eax
se ne prepisuje, tako da je moguće koristiti ret2eax
.
U ARM64 nema instrukcija koje omogućavaju skakanje na SP registar. Možda bi bilo moguće pronaći gadget koji premesti sp u registar i zatim skoči na taj registar, ali u libc mog kali nisam mogao pronaći nijedan gadget poput toga:
Jedini koje sam otkrio bi promenili vrednost registra gde je sp kopiran pre nego što se na njega skoči (tako da bi postao beskoristan):
Ako registar ima zanimljivu adresu, moguće je skočiti na nju jednostavno pronalazeći adekvatnu instrukciju. 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šavanje.
Example code:
Proverom disasembly-a funkcije moguće je videti da je adresa do bafera (vulnerabilna na bof i kontrolisana od strane korisnika) smeštena u x0
pre nego što se vrati iz buffer overflow-a:
Takođe je moguće pronaći gadget br x0
u funkciji do_stuff
:
Iskoristićemo taj gadget da skočimo na njega jer je binarni fajl kompajliran BEZ PIE. Koristeći obrazac moguće je videti da je offset buffer overflow-a 80, tako da bi exploit bio:
Ako je umesto fgets
korišćeno nešto poput read
, bilo bi moguće zaobići PIE tako što bi se samo prepisali poslednja 2 bajta adrese povratka da bi se vratio na instrukciju br x0;
bez potrebe da se zna cela adresa.
Sa fgets
to ne funkcioniše jer dodaje null (0x00) bajt na kraju.
NX: Ako stek nije izvršiv, ovo neće pomoći jer treba da stavimo shellcode u stek i skočimo da ga izvršimo.
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)