65 lines
3.9 KiB
Markdown

# AW2Exec - GOT/PLT
{{#include ../../../banners/hacktricks-training.md}}
## **Basiese Inligting**
### **GOT: Globale Offset Tabel**
Die **Globale Offset Tabel (GOT)** is 'n mechanisme wat in dinamies gekoppelde binêre 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 sy 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 om die dinamiese skakelaar aan te roep 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,** GOT-inskrywings word 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 (619).png>)
Let op hoe jy na **laai** van die **uitvoerbare** 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) (1) (1) (1) (1) (1) (1) (1) (1) (5).png>)
Met GEF kan jy 'n **debugging** sessie **begin** en **`got`** uitvoer om die got tabel te sien:
![](<../../../images/image (621).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 system funksie gestuur word kan beheer).
As **`system`** **nie gebruik** word deur die skrip nie, sal die system funksie **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`**
## **Een Gadget**
{{#ref}}
../one-gadget.md
{{#endref}}
## **Beskermings**
Die **Volle 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}}