mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
90 lines
5.5 KiB
Markdown
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`**
|
|
|
|
.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`
|
|
|
|
 (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:
|
|
|
|
.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}}
|