hacktricks/binary-exploitation/arbitrary-write-2-exec/aw2exec-got-plt.md

7.8 KiB

WWW2Exec - GOT/PLT

{% hint style="success" %} Naučite i vežbajte hakovanje AWS-a:HackTricks Training AWS Red Team Expert (ARTE)
Naučite i vežbajte hakovanje GCP-a: HackTricks Training GCP Red Team Expert (GRTE)

Podržite HackTricks
{% endhint %}

Osnovne informacije

GOT: Globalna tabela offseta

Globalna tabela offseta (GOT) je mehanizam koji se koristi u dinamički povezanim binarnim fajlovima za upravljanje adresama spoljnih funkcija. Pošto ove adrese nisu poznate do vremena izvršavanja (zbog dinamičkog povezivanja), GOT pruža način da se dinamički ažuriraju adrese ovih spoljnih simbola nakon što budu rešene.

Svaki unos u GOT-u odgovara simbolu u spoljnim bibliotekama koje binarni fajl može pozvati. Kada se funkcija prvi put pozove, njena stvarna adresa se rešava dinamičkim povezivačem i čuva u GOT-u. Naknadni pozivi iste funkcije koriste adresu sačuvanu u GOT-u, čime se izbegava trošak ponovnog rešavanja adrese.

PLT: Tabela vezivanja postupaka

Tabela vezivanja postupaka (PLT) tesno sarađuje sa GOT-om i služi kao trambolina za rukovanje pozivima spoljnih funkcija. Kada binarni fajl pozove spoljnu funkciju prvi put, kontrola se prenosi na unos u PLT-u koji je povezan sa tom funkcijom. Taj unos PLT-a je odgovoran za pozivanje dinamičkog povezivača da reši adresu funkcije ako već nije rešena. Nakon što se adresa reši, čuva se u GOT-u.

Stoga, unosi u GOT-u se direktno koriste kada se adresa spoljne funkcije ili promenljive reši. Unosi u PLT-u se koriste za olakšavanje početne rezolucije ovih adresa putem dinamičkog povezivača.

Dobijanje izvršenja

Provera GOT-a

Dobijte adresu tabele GOT pomoću: objdump -s -j .got ./exec

Primetite kako nakon učitavanja izvršnog fajla u GEF-u možete videti funkcije koje su u GOT-u: gef➤ x/20x 0xADDR_GOT

Korišćenjem GEF-a možete zapoceti debugging sesiju i izvršiti got da biste videli got tabelu:

GOT2Exec

U binarnom fajlu GOT ima adrese funkcija ili odeljak PLT koji će učitati adresu funkcije. Cilj ovog proizvoljnog pisanja je da se zameni unos u GOT-u funkcije koja će biti izvršena kasnije sa adresom PLT-a funkcije na primer system.

Idealno je zameniti GOT neke funkcije koja će biti pozvana sa parametrima koje kontrolišete (tako da ćete moći da kontrolišete parametre poslate funkciji sistema).

Ako system nije korišćen od strane binarnog fajla, funkcija sistema neće imati unos u PLT-u. U ovom scenariju, moraćete prvo procureti adresu funkcije system a zatim prebrisati GOT da pokazuje na ovu adresu.

Možete videti adrese PLT-a sa objdump -j .plt -d ./vuln_binary

Unosi GOT-a libc-a

GOT libc-a se obično kompajluje sa delimičnim RELRO-om, što ga čini dobrim ciljem za ovo pod uslovom da je moguće saznati njegovu adresu (ASLR).

Uobičajene funkcije libc-a će pozvati druge interne funkcije čiji GOT može biti prebrisiv kako bi se dobilo izvršenje koda.

Pronađite više informacija o ovoj tehnici ovde.

Free2system

U CTF-ovima za eksploataciju hipa često je moguće kontrolisati sadržaj blokova i u nekom trenutku čak prebrisati GOT tabelu. Jedan jednostavan trik za dobijanje RCE ako nisu dostupni jednostavni alati je prebrisati adresu free u GOT-u da pokazuje na system i zapisati unutar bloka "/bin/sh". Na ovaj način, kada se ovaj blok oslobodi, izvršiće se system("/bin/sh").

Strlen2system

Još jedna uobičajena tehnika je prebrisati strlen adresu u GOT-u da pokazuje na system, tako da ako se ova funkcija pozove sa korisničkim unosom moguće je proslediti string "/bin/sh" i dobiti shell.

Osim toga, ako se puts koristi sa korisničkim unosom, moguće je prebrisati adresu strlen u GOT-u da pokazuje na system i proslediti string "/bin/sh" da biste dobili shell jer puts će pozvati strlen sa korisničkim unosom.

Jedan alat

{% content-ref url="../rop-return-oriented-programing/ret2lib/one-gadget.md" %} one-gadget.md {% endcontent-ref %}

Zloupotreba GOT-a iz hipa

Uobičajeni način dobijanja RCE iz ranjivosti hipa je zloupotreba fastbin-a kako bi se deo GOT tabele dodao u brzi bin, tako da će biti moguće prebrisati pokazivač funkcije, obično free.
Zatim, usmeravanje free na system i oslobađanje bloka gde je napisano /bin/sh\x00 izvršiće shell.

Moguće je pronaći primer ovde.

Zaštite

Zaštita Full RELRO namenjena je zaštiti od ovakvih tehnika tako što rešava sve adrese funkcija kada se binarni fajl pokrene i čini GOT tabelu samo za čitanje nakon toga:

{% content-ref url="../common-binary-protections-and-bypasses/relro.md" %} relro.md {% endcontent-ref %}

Reference

{% hint style="success" %} Naučite i vežbajte hakovanje AWS:HackTricks Obuka AWS Red Tim Ekspert (ARTE)
Naučite i vežbajte hakovanje GCP-a: HackTricks Obuka GCP Red Tim Ekspert (GRTE)

Podržite HackTricks
{% endhint %}