92 lines
5.5 KiB
Markdown

# WWW2Exec - GOT/PLT
{{#include ../../banners/hacktricks-training.md}}
## **Basic Information**
### **GOT: Global Offset Table**
**Global Offset Table (GOT)** ni mekanizma inayotumika katika binaries zinazounganishwa kwa njia ya dynamic ili kudhibiti **anwani za kazi za nje**. Kwa kuwa **anwani hizi hazijulikani hadi wakati wa utekelezaji** (kwa sababu ya uunganishaji wa dynamic), GOT inatoa njia ya **kudumisha anwani za alama hizi za nje** mara tu zinapokuwa zimepatiwa.
Kila kipengele katika GOT kinahusiana na alama katika maktaba za nje ambazo binary inaweza kuita. Wakati **kazi inapoitwa kwa mara ya kwanza, anwani yake halisi inapatikana na linker wa dynamic na kuhifadhiwa katika GOT**. Kuitwa kwa kazi hiyo tena hutumia anwani iliyohifadhiwa katika GOT, hivyo kuepusha mzigo wa kutafuta anwani hiyo tena.
### **PLT: Procedure Linkage Table**
**Procedure Linkage Table (PLT)** inafanya kazi kwa karibu na GOT na inatumika kama trampoline kushughulikia simu za kazi za nje. Wakati binary **inapoiita kazi ya nje kwa mara ya kwanza, udhibiti unapelekwa kwa kipengele katika PLT kinachohusishwa na kazi hiyo**. Kipengele hiki cha PLT kinawajibika kwa kuita linker wa dynamic ili kupata anwani ya kazi hiyo ikiwa haijapatikana tayari. Baada ya anwani kupatikana, inahifadhiwa katika **GOT**.
**Hivyo,** vipengele vya GOT vinatumika moja kwa moja mara tu anwani ya kazi au variable ya nje inapokuwa imepatiwa. **Vipengele vya PLT vinatumika kuwezesha upatikanaji wa awali** wa anwani hizi kupitia linker wa dynamic.
## Get Execution
### Check the GOT
Pata anwani ya jedwali la GOT kwa: **`objdump -s -j .got ./exec`**
![](<../../images/image (121).png>)
Tazama jinsi baada ya **kupakia** **executable** katika GEF unaweza **kuona** **kazi** ambazo ziko katika **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) (1) (2) (2) (2).png>)
Kwa kutumia GEF unaweza **kuanza** kikao cha **debugging** na kutekeleza **`got`** ili kuona jedwali la got:
![](<../../images/image (496).png>)
### GOT2Exec
Katika binary GOT ina **anwani za kazi au** sehemu ya **PLT** ambayo itapakia anwani ya kazi. Lengo la kuandika hii bila mpangilio ni **kufuta kipengele cha GOT** cha kazi ambayo itatekelezwa baadaye **na** **anwani** ya PLT ya **`system`** **kazi** kwa mfano.
Kwa njia bora, utakuwa **unafuta** **GOT** ya **kazi** ambayo **itaitwa na vigezo vinavyodhibitiwa na wewe** (hivyo utaweza kudhibiti vigezo vinavyotumwa kwa kazi ya system).
Ikiwa **`system`** **haitumiki** na binary, kazi ya system **haitakuwa** na kipengele katika PLT. Katika hali hii, utahitaji **kuvuja kwanza anwani** ya kazi ya `system` na kisha kufuta GOT ili kuelekeza kwenye anwani hii.
Unaweza kuona anwani za PLT kwa **`objdump -j .plt -d ./vuln_binary`**
## libc GOT entries
**GOT ya libc** kwa kawaida inajumuishwa na **partial RELRO**, na kuifanya kuwa lengo zuri kwa hii ikiwa inawezekana kubaini anwani yake ([**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html)).
Kazi za kawaida za libc zitaita **kazi nyingine za ndani** ambazo GOT yake inaweza kufutwa ili kupata utekelezaji wa msimbo.
Pata [**maelezo zaidi kuhusu mbinu hii hapa**](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md#1---targetting-libc-got-entries).
### **Free2system**
Katika uhalifu wa heap CTFs ni kawaida kuwa na uwezo wa kudhibiti maudhui ya chunks na kwa wakati fulani hata kufuta jedwali la GOT. Njia rahisi ya kupata RCE ikiwa gadgets moja hazipatikani ni kufuta anwani ya `free` GOT ili kuelekeza kwenye `system` na kuandika ndani ya chunk `"/bin/sh"`. Kwa njia hii wakati chunk hii itakapofutwa, itatekeleza `system("/bin/sh")`.
### **Strlen2system**
Mbinu nyingine ya kawaida ni kufuta anwani ya **`strlen`** GOT ili kuelekeza kwenye **`system`**, hivyo ikiwa kazi hii itaitwa na pembejeo ya mtumiaji inawezekana kupitisha mfuatano `"/bin/sh"` na kupata shell.
Zaidi ya hayo, ikiwa `puts` inatumika na pembejeo ya mtumiaji, inawezekana kufuta anwani ya `strlen` GOT ili kuelekeza kwenye `system` na kupitisha mfuatano `"/bin/sh"` ili kupata shell kwa sababu **`puts` itaita `strlen` na pembejeo ya mtumiaji**.
## **One Gadget**
{{#ref}}
../rop-return-oriented-programing/ret2lib/one-gadget.md
{{#endref}}
## **Abusing GOT from Heap**
Njia ya kawaida ya kupata RCE kutoka kwa udhaifu wa heap ni kutumia fastbin ili iwezekane kuongeza sehemu ya jedwali la GOT ndani ya fast bin, hivyo kila wakati chunk hiyo itakapopangwa itakuwa inawezekana **kufuta kiashiria cha kazi, kawaida `free`**.\
Kisha, kuelekeza `free` kwenye `system` na kufuta chunk ambapo ilandikwa `/bin/sh\x00` itatekeleza shell.
Inawezekana kupata [**mfano hapa**](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/chunk_extend_overlapping/#hitcon-trainging-lab13)**.**
## **Protections**
Ulinzi wa **Full RELRO** unakusudia kulinda dhidi ya aina hii ya mbinu kwa kutatua anwani zote za kazi wakati binary inapoanzishwa na kufanya jedwali la **GOT kuwa lisiloweza kusomeka** baada ya hapo:
{{#ref}}
../common-binary-protections-and-bypasses/relro.md
{{#endref}}
## References
- [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}}