90 lines
5.5 KiB
Markdown

# WWW2Exec - GOT/PLT
{{#include ../../banners/hacktricks-training.md}}
## **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 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 preopterećenje ponovnog rešavanja adrese.
### **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 **pozove spoljašnju funkciju prvi put, 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 kada 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`**
![](<../../images/image (121).png>)
Posmatrajte kako nakon **učitavanja** **izvršne datoteke** u GEF možete **videti** **funkcije** koje se nalaze u **GOT**: `gef➤ x/20x 0xADDR_GOT`
![](<../../images/image (620) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (2) (2) (2).png>)
Koristeći GEF možete **početi** sesiju **debugovanja** i izvršiti **`got`** da vidite got tabelu:
![](<../../images/image (496).png>)
### 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**](../common-binary-protections-and-bypasses/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**](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md#1---targetting-libc-got-entries).
### **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 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**
{{#ref}}
../rop-return-oriented-programing/ret2lib/one-gadget.md
{{#endref}}
## **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**](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/chunk_extend_overlapping/#hitcon-trainging-lab13)**.**
## **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:
{{#ref}}
../common-binary-protections-and-bypasses/relro.md
{{#endref}}
## Reference
- [https://ir0nstone.gitbook.io/notes/types/stack/got-overwrite/exploiting-a-got-overwrite](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](https://ir0nstone.gitbook.io/notes/types/stack/one-gadgets-and-malloc-hook)
{{#include ../../banners/hacktricks-training.md}}