WWW2Exec - GOT/PLT
Reading time: 6 minutes
tip
Leer & oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer & oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Ondersteun HackTricks
- Kyk na die subskripsie planne!
- Sluit aan by die 💬 Discord groep of die telegram groep of volg ons op Twitter 🐦 @hacktricks_live.
- Deel hacking truuks deur PRs in te dien na die HackTricks en HackTricks Cloud github repos.
Basiese Inligting
GOT: Globale Offset Tabel
Die Globale Offset Tabel (GOT) is 'n meganisme 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 (weens 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 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
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
Met GEF kan jy 'n debugging sessie begin en got
uitvoer om die got-tabel te sien:
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 oorheers 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 oorheers (sodat jy die parameters wat na die system-funksie gestuur word kan beheer).
As system
nie gebruik word deur die binêre 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 oorskryf 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).
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.
Free2system
In heap-exploitering CTFs is dit algemeen om die inhoud van stukke te kan beheer en op 'n stadium selfs die GOT-tabel te oorskryf. 'n Eenvoudige truuk om RCE te verkry as een gadgets nie beskikbaar is nie, is om die free
GOT-adres te oorskryf 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 oorskryf 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 oorskryf 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
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 oorheers.
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 te vind.
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:
Verwysings
- 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
tip
Leer & oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer & oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Ondersteun HackTricks
- Kyk na die subskripsie planne!
- Sluit aan by die 💬 Discord groep of die telegram groep of volg ons op Twitter 🐦 @hacktricks_live.
- Deel hacking truuks deur PRs in te dien na die HackTricks en HackTricks Cloud github repos.