WWW2Exec - GOT/PLT
Reading time: 5 minutes
tip
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žite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.
Osnovne informacije
GOT: Global Offset Table
Global Offset Table (GOT) je mehanizam koji se koristi u dinamički povezanim binarnim datotekama za upravljanje adresama spoljašnjih funkcija. Pošto su te adrese nepoznate do vremena izvršavanja (zbog dinamičkog povezivanja), GOT pruža način da se dinamički ažuriraju adrese ovih spoljašnjih simbola kada se jednom reše.
Svaki unos u GOT odgovara simbolu u spoljnim bibliotekama koje binarna datoteka može pozvati. Kada se funkcija prvi put pozove, njena stvarna adresa se rešava putem dinamičkog linker-a i čuva u GOT. Naknadni pozivi iste funkcije koriste adresu koja je sačuvana u GOT, čime se izbegava dodatno opterećenje rešavanja adrese ponovo.
PLT: Procedure Linkage Table
Procedure Linkage Table (PLT) blisko sarađuje sa GOT i služi kao trampolin za upravljanje pozivima spoljašnjim funkcijama. Kada binarna datoteka prvi put pozove spoljašnju funkciju, kontrola se prebacuje na unos u PLT koji je povezan sa tom funkcijom. Ovaj PLT unos je odgovoran za pozivanje dinamičkog linker-a da reši adresu funkcije ako već nije rešena. Nakon što se adresa reši, ona se čuva u GOT.
Dakle, GOT unosi se koriste direktno nakon što se adresa spoljašnje funkcije ili promenljive reši. PLT unosi se koriste za olakšavanje inicijalnog rešavanja ovih adresa putem dinamičkog linker-a.
Dobijanje izvršenja
Proverite GOT
Dobijte adresu GOT tabele sa: objdump -s -j .got ./exec
Primetite kako nakon učitavanja izvršne datoteke u GEF možete videti funkcije koje se nalaze u GOT: gef➤ x/20x 0xADDR_GOT
Koristeći GEF možete početi sesiju debugovanja i izvršiti got
da vidite got tabelu:
GOT2Exec
U binarnoj datoteci GOT ima adrese funkcija ili do PLT sekcije koja će učitati adresu funkcije. Cilj ovog proizvoljnog pisanja je da prepiše GOT unos funkcije koja će biti izvršena kasnije sa adresom PLT-a system
funkcije na primer.
Idealan scenario je da prepišete GOT funkcije koja će biti pozvana sa parametrima koje kontrolišete (tako da ćete moći da kontrolišete parametre poslati sistemskoj funkciji).
Ako system
nije korišćen od strane binarne datoteke, sistemska funkcija neće imati unos u PLT-u. U ovom scenariju, prvo ćete morati da iscurite adresu funkcije system
i zatim prepisati GOT da pokazuje na ovu adresu.
Možete videti PLT adrese sa objdump -j .plt -d ./vuln_binary
libc GOT unosi
GOT libc se obično kompajlira sa delimičnim RELRO, što ga čini dobrim ciljem za ovo pod pretpostavkom da je moguće utvrditi njegovu adresu (ASLR).
Uobičajene funkcije libc će pozvati druge interne funkcije čiji GOT bi mogao biti prepisan kako bi se dobila izvršna kod.
Pronađite više informacija o ovoj tehnici ovde.
Free2system
U eksploataciji heap-a na CTF-ima je uobičajeno moći kontrolisati sadržaj delova i u nekom trenutku čak i prepisati GOT tabelu. Jednostavna trik da se dobije RCE ako jedan gadgeti nisu dostupni je da se prepiše free
GOT adresa da pokazuje na system
i da se unese u deo "/bin/sh"
. Na ovaj način, kada se ovaj deo oslobodi, izvršiće se system("/bin/sh")
.
Strlen2system
Još jedna uobičajena tehnika je prepisivanje strlen
GOT adrese da pokazuje na system
, tako da ako se ova funkcija pozove sa korisničkim unosom, moguće je proslediti string "/bin/sh"
i dobiti shell.
Štaviše, ako se puts
koristi sa korisničkim unosom, moguće je prepisati strlen
GOT adresu da pokazuje na system
i proslediti string "/bin/sh"
da bi se dobio shell jer puts
će pozvati strlen
sa korisničkim unosom.
Jedan Gadget
Zloupotreba GOT iz Heap-a
Uobičajen način da se dobije RCE iz ranjivosti heap-a je zloupotreba fastbin-a tako da je moguće dodati deo GOT tabele u fast bin, tako da kad god se taj deo alocira, biće moguće prepisati pokazivač funkcije, obično free
.
Zatim, usmeravanje free
na system
i oslobađanje dela gde je napisan /bin/sh\x00
izvršiće shell.
Moguće je pronaći primer ovde.
Zaštite
Zaštita Full RELRO je namenjena zaštiti od ove vrste tehnike rešavanjem svih adresa funkcija kada se binarna datoteka pokrene i čineći GOT tabelu samo za čitanje nakon toga:
Reference
- https://ir0nstone.gitbook.io/notes/types/stack/got-overwrite/exploiting-a-got-overwrite
- https://ir0nstone.gitbook.io/notes/types/stack/one-gadgets-and-malloc-hook
tip
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žite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.