Basic Stack Binary Exploitation Methodology
Last updated
Last updated
Naučite i vežbajte hakovanje AWS-a:HackTricks Obuka AWS Crveni Tim Ekspert (ARTE) Naučite i vežbajte hakovanje GCP-a: HackTricks Obuka GCP Crveni Tim Ekspert (GRTE)
Pre nego što počnete eksploatisati bilo šta, korisno je razumeti deo strukture ELF binarnog fajla:
ELF Basic InformationS obzirom na toliko tehnika, dobro je imati šemu kada će svaka tehnika biti korisna. Imajte na umu da će iste zaštite uticati na različite tehnike. Možete pronaći načine zaobilaženja zaštita u svakom delu zaštite, ali ne u ovoj metodologiji.
Postoje različiti načini na koje možete kontrolisati tok programa:
Preplavljivanje steka prepisivanjem pokazivača povratka sa steka ili EBP -> ESP -> EIP.
Možda će biti potrebno zloupotrebiti Prekoračenje celih brojeva da biste izazvali prekoračenje
Ili putem Proizvoljnog Pisanja + Pisanja Gde Šta ka Izvršenju
Formatiranje stringova: Zloupotreba printf
za pisanje proizvoljnog sadržaja na proizvoljne adrese.
Indeksiranje nizova: Zloupotreba loše dizajniranog indeksiranja kako biste mogli kontrolisati neke nizove i dobiti proizvoljno pisanje.
Možda će biti potrebno zloupotrebiti Prekoračenje celih brojeva da biste izazvali prekoračenje
bof do WWW putem ROP-a: Zloupotreba prekoračenja bafera za konstruisanje ROP-a i mogućnost dobijanja WWW.
Tehnike Pisanja Gde Šta ka Izvršenju možete pronaći u:
Write What Where 2 ExecNešto što treba uzeti u obzir je da obično samo jedna eksploatacija ranjivosti možda neće biti dovoljna da se izvrši uspešan eksploatacija, posebno ako neke zaštite treba zaobići. Stoga je interesantno razmotriti neke opcije kako učiniti jednu ranjivost eksploatabilnom više puta u istom izvršavanju binarnog fajla:
Upisati adresu main
funkcije u ROP lanac ili adresu gde se događa ranjivost.
Kontrolisanjem odgovarajućeg ROP lanca možda ćete moći izvršiti sve radnje u tom lancu
Upisati adresu exit
funkcije u GOT (ili bilo koje druge funkcije koje koristi binarni fajl pre završetka) adresu za povratak na ranjivost
Kao što je objašnjeno u .fini_array, ovde čuvajte 2 funkcije, jednu za ponovno pozivanje ranjivosti i drugu za pozivanje __libc_csu_fini
koja će ponovo pozvati funkciju iz .fini_array
.
ret2win: Postoji funkcija u kodu koju treba pozvati (možda sa određenim parametrima) kako biste dobili zastavu.
U bof-u sa PIE, moraćete da je zaobiđete
U bof-u sa canary, moraćete da je zaobiđete
Ako treba postaviti više parametara da biste pravilno pozvali funkciju ret2win možete koristiti:
ROP lanac ako postoji dovoljno gedžeta za pripremu svih parametara
SROP (u slučaju da možete pozvati ovaj sistemski poziv) da kontrolišete mnoge registre
Putem Pisanja Gde Šta ka Izvršenju možete zloupotrebiti druge ranjivosti (ne bof) da biste pozvali funkciju win
.
Preusmeravanje pokazivača: Ukoliko stek sadrži pokazivače ka funkciji koja će biti pozvana ili ka stringu koji će biti korišćen od strane zanimljive funkcije (system ili printf), moguće je prepisati tu adresu.
Neinicijalizovane promenljive: Nikad ne znate.
(Stack) Shell kod: Ovo je korisno za smeštanje shell koda na stek pre ili posle prepisivanja pokazivača povratka, a zatim skočiti na njega da ga izvršite:
U svakom slučaju, ako postoji canary, u običnom bof-u moraćete da je zaobiđete (procurite)
Sa ASLR moraćete koristiti tehnike poput ret2esp/ret2reg da biste skočili na nju
Ovo će mešati shell kod sa ROP lancem.
Ret2syscall: Korisno za pozivanje execve
kako bi se pokrenule proizvoljne komande. Potrebno je pronaći gadgete za pozivanje određenog syscall-a sa parametrima.
SROP može biti koristan za pripremu ret2execve
Ret2lib: Korisno za pozivanje funkcije iz biblioteke (obično iz libc
) poput system
sa nekim pripremljenim argumentima (npr. '/bin/sh'
). Potrebno je da binarni fajl učita biblioteku sa funkcijom koju želite da pozovete (obično libc).
Ako je statički kompajliran i nema PIE, adresa system
-a i /bin/sh
se neće promeniti, pa je moguće statički ih koristiti.
Bez ASLR i poznavanja verzije libc-a koja je učitana, adresa system
-a i /bin/sh
se neće promeniti, pa je moguće statički ih koristiti.
Koristite ret2dlresolve
da rešite adresu system
-a i pozovete je
Pobedite ASLR i izračunajte adresu system
-a i '/bin/sh'
u memoriji.
Pobediti PIE
Pronaći korišćenu verziju libc-a (procureti nekoliko adresa funkcija)
Proveriti prethodne scenarije sa ASLR-om kako biste nastavili.
Stack Pivoting / EBP2Ret / EBP Chaining: Kontrolišite ESP kako biste kontrolisali RET putem sačuvanog EBP-a na steku.
Korisno za off-by-one preplavljivanje steka
Korisno kao alternativni način za završetak kontrole EIP-a dok zloupotrebljavate EIP za konstruisanje payload-a u memoriji, a zatim skakanje na njega putem EBP-a
Preusmeravanje pokazivača: U slučaju da stek sadrži pokazivače ka funkciji koja će biti pozvana ili ka stringu koji će biti korišćen od strane zanimljive funkcije (system ili printf), moguće je prepisati tu adresu.
Neinicijalizovane promenljive: Nikad ne znate