# WWW2Exec - GOT/PLT {{#include ../../banners/hacktricks-training.md}} ## **Basiese Inligting** ### **GOT: Globale Offset Tabel** Die **Globale Offset Tabel (GOT)** is 'n meganisme wat in dinamies gekoppelde binêre lêers gebruik word om die **adresse van eksterne funksies** te bestuur. Aangesien hierdie **adresse nie bekend is tot tyd van uitvoering** (as gevolg van dinamiese koppeling), bied die GOT 'n manier om die **adresse van hierdie eksterne simbole dinamies op te dateer** sodra hulle opgelos is. Elke inskrywing in die GOT kom ooreen met 'n simbool in die eksterne biblioteke wat die binêre mag aanroep. Wanneer 'n **funksie vir die eerste keer aangeroep word, word die werklike adres deur die dinamiese skakelaar opgelos en in die GOT gestoor**. Volgende oproepe na dieselfde funksie gebruik die adres wat in die GOT gestoor is, en vermy dus die oorhoofse koste van die adres weer op te los. ### **PLT: Prosedure Koppeling Tabel** Die **Prosedure Koppeling Tabel (PLT)** werk nou saam met die GOT en dien as 'n trampolien om oproepe na eksterne funksies te hanteer. Wanneer 'n binêre **'n eksterne funksie vir die eerste keer aanroep, word beheer oorgedra na 'n inskrywing in die PLT wat met daardie funksie geassosieer is**. Hierdie PLT-inskrywing is verantwoordelik vir die aanroep van die dinamiese skakelaar om die funksie se adres op te los as dit nog nie opgelos is nie. Nadat die adres opgelos is, word dit in die **GOT** gestoor. **Daarom** word GOT-inskrywings direk gebruik sodra die adres van 'n eksterne funksie of veranderlike opgelos is. **PLT-inskrywings word gebruik om die aanvanklike resolusie** van hierdie adresse via die dinamiese skakelaar te fasiliteer. ## Kry Uitvoering ### Kontroleer die GOT Kry die adres na die GOT-tabel met: **`objdump -s -j .got ./exec`** ![](<../../images/image (121).png>) Let op hoe jy na **laai** van die **uitvoerbare lêer** in GEF die **funksies** wat in die **GOT** is kan **sien**: `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>) Met GEF kan jy 'n **debugging** sessie **begin** en **`got`** uitvoer om die got-tabel te sien: ![](<../../images/image (496).png>) ### GOT2Exec In 'n binêre het die GOT die **adresse na die funksies of** na die **PLT** afdeling wat die funksie-adres sal laai. Die doel van hierdie arbitrêre skrywe is om 'n **GOT-inskrywing** van 'n funksie wat later gaan uitgevoer word **te oorskry** met die **adres** van die PLT van die **`system`** **funksie** byvoorbeeld. Ideaal gesproke, sal jy die **GOT** van 'n **funksie** wat **met parameters wat deur jou beheer word** gaan aangeroep word **oorskry** (sodat jy die parameters wat na die systeemfunksie gestuur word, kan beheer). As **`system`** **nie gebruik word** deur die binêre nie, sal die systeemfunksie **nie** 'n inskrywing in die PLT hê nie. In hierdie scenario sal jy **eers die adres** van die `system` funksie moet lek en dan die GOT oorskry om na hierdie adres te wys. Jy kan die PLT-adresse sien met **`objdump -j .plt -d ./vuln_binary`** ## libc GOT-inskrywings Die **GOT van libc** word gewoonlik saamgecompileer met **gedeeltelike RELRO**, wat dit 'n goeie teiken maak vir hierdie, mits dit moontlik is om sy adres te bepaal ([**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html)). Gewone funksies van die libc gaan **ander interne funksies** aanroep waarvan die GOT oorgeskryf kan word om kode-uitvoering te verkry. Vind [**meer inligting oor hierdie tegniek hier**](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md#1---targetting-libc-got-entries). ### **Free2system** In heap-uitbuiting CTFs is dit algemeen om die inhoud van stukke te kan beheer en op 'n sekere punt selfs die GOT-tabel te oorskry. 'n Eenvoudige truuk om RCE te verkry as een gadgets nie beskikbaar is nie, is om die `free` GOT-adres te oorskry om na `system` te wys en om binne 'n stuk `"/bin/sh"` te skryf. Op hierdie manier, wanneer hierdie stuk vrygestel word, sal dit `system("/bin/sh")` uitvoer. ### **Strlen2system** Nog 'n algemene tegniek is om die **`strlen`** GOT-adres te oorskry om na **`system`** te wys, sodat as hierdie funksie met gebruikersinvoer aangeroep word, dit moontlik is om die string `"/bin/sh"` deur te gee en 'n shell te verkry. Boonop, as `puts` met gebruikersinvoer gebruik word, is dit moontlik om die `strlen` GOT-adres te oorskry om na `system` te wys en die string `"/bin/sh"` deur te gee om 'n shell te verkry omdat **`puts` `strlen` met die gebruikersinvoer sal aanroep**. ## **Een Gadget** {{#ref}} ../rop-return-oriented-programing/ret2lib/one-gadget.md {{#endref}} ## **Misbruik van GOT vanaf Heap** 'n Algemene manier om RCE van 'n heap-kwesbaarheid te verkry, is om 'n fastbin te misbruik sodat dit moontlik is om die deel van die GOT-tabel in die fast bin by te voeg, sodat wanneer daardie stuk toegeken word, dit moontlik sal wees om die **aanwyser van 'n funksie, gewoonlik `free`**, te oorskry.\ Dan, deur `free` na `system` te wys en 'n stuk waar `/bin/sh\x00` geskryf is, vry te stel, sal dit 'n shell uitvoer. Dit is moontlik om 'n [**voorbeeld hier**](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/chunk_extend_overlapping/#hitcon-trainging-lab13)** te vind.** ## **Beskermings** Die **Volledige RELRO** beskerming is bedoel om teen hierdie soort tegniek te beskerm deur al die adresse van die funksies op te los wanneer die binêre begin en die **GOT-tabel slegs leesbaar** te maak daarna: {{#ref}} ../common-binary-protections-and-bypasses/relro.md {{#endref}} ## Verwysings - [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}}