# WWW2Exec - GOT/PLT {{#include ../../banners/hacktricks-training.md}} ## **Basic Information** ### **GOT: Global Offset Table** **Global Offset Table (GOT)** ni mekanizma inayotumika katika binaries zilizounganishwa 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 **kupdate 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 kuzuia 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 kinachohusiana na kazi hiyo**. Kipengele hiki cha PLT kinawajibika kwa kuita linker wa dynamic ili kutafuta 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 kutafuta awali** za 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 bila mpangilio hili ni **kuziba kipengele cha GOT** cha kazi ambayo itatekelezwa baadaye **na** **anwani** ya PLT ya **`system`** **kazi** kwa mfano. Kwa kawaida, utakuwa **ukiziba** **GOT** ya **kazi** ambayo **itaitwa na vigezo vinavyodhibitiwa na wewe** (hivyo utaweza kudhibiti vigezo vinavyotumwa kwa kazi ya mfumo). Ikiwa **`system`** **haitumiki** na binary, kazi ya mfumo **haitakuwa** na kipengele katika PLT. Katika hali hii, utahitaji **kuvuja kwanza anwani** ya kazi ya `system` na kisha kubadilisha 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 inakusanywa na **partial RELRO**, na kuifanya kuwa lengo zuri kwa hili 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 kubadilishwa 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 kubadilisha jedwali la GOT. Njia rahisi ya kupata RCE ikiwa gadgets moja hazipatikani ni kubadilisha 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 kubadilisha anwani ya **`strlen`** GOT ili kuelekeza kwenye **`system`**, hivyo ikiwa kazi hii itaombwa na pembejeo ya mtumiaji inawezekana kupitisha mfuatano `"/bin/sh"` na kupata shell. Zaidi ya hayo, ikiwa `puts` inatumika na pembejeo ya mtumiaji, inawezekana kubadilisha 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 **kuziba 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 kutafuta anwani zote za kazi wakati binary inapoanzishwa na kufanya jedwali la **GOT kuwa lisilosomeka** 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}}