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

6.2 KiB

WWW2Exec - GOT/PLT

Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks:

Podstawowe informacje

GOT: Global Offset Table

Global Offset Table (GOT) to mechanizm używany w binariach dynamicznie łączonych do zarządzania adresami funkcji zewnętrznych. Ponieważ te adresy nie są znane do czasu wykonania (ze względu na dynamiczne łączenie), GOT zapewnia sposób dynamicznego aktualizowania adresów tych zewnętrznych symboli po ich rozwiązaniu.

Każdy wpis w GOT odpowiada symbolowi w zewnętrznych bibliotekach, które binarny może wywołać. Gdy funkcja jest pierwszy raz wywołana, jej rzeczywisty adres jest rozwiązywany przez dynamiczny łącznik i przechowywany w GOT. Kolejne wywołania tej samej funkcji korzystają z adresu przechowywanego w GOT, unikając tym samym ponownego rozwiązywania adresu.

PLT: Procedure Linkage Table

Procedure Linkage Table (PLT) ściśle współpracuje z GOT i służy jako trampolina do obsługi wywołań funkcji zewnętrznych. Gdy binarny wywołuje funkcję zewnętrzną po raz pierwszy, kontrola przechodzi do wpisu w PLT powiązanego z tą funkcją. Ten wpis PLT jest odpowiedzialny za wywołanie dynamicznego łącznika w celu rozwiązania adresu funkcji, jeśli nie został on jeszcze rozwiązany. Po rozwiązaniu adres jest przechowywany w GOT.

Dlatego wpisy GOT są używane bezpośrednio, gdy adres funkcji lub zmiennej zewnętrznej jest rozwiązany. Wpisy PLT są używane do ułatwienia początkowego rozwiązania tych adresów za pomocą dynamicznego łącznika.

Uruchomienie wykonania

Sprawdź GOT

Uzyskaj adres tabeli GOT za pomocą: objdump -s -j .got ./exec

Zauważ, jak po załadowaniu wykonywalnego pliku w GEF możesz zobaczyć funkcje, które znajdują się w GOT: gef➤ x/20x 0xDIR_GOT

Korzystając z GEF, możesz rozpocząć sesję debugowania i wykonać got aby zobaczyć tabelę GOT:

GOT2Exec

W binarnym GOT znajdują się adresy funkcji lub sekcji PLT, która załaduje adres funkcji. Celem tego dowolnego zapisu jest nadpisanie wpisu GOT funkcji, która zostanie wykonana później adresem PLT funkcji system na przykład.

Idealnie, nadpiszesz GOT funkcji, która zostanie wywołana z kontrolowanymi przez ciebie parametrami (dzięki czemu będziesz mógł kontrolować parametry przesłane do funkcji system).

Jeśli system nie jest używany przez skrypt, funkcja systemowa nie będzie miała wpisu w PLT. W takim scenariuszu będziesz musiał najpierw ujawnić adres funkcji system, a następnie nadpisać GOT, aby wskazywał na ten adres.

Możesz zobaczyć adresy PLT za pomocą objdump -j .plt -d ./vuln_binary

One Gadget

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

Zabezpieczenia

Ochrona FullRELRO ma na celu ochronę przed tego rodzaju techniką, rozwiązując wszystkie adresy funkcji podczas uruchamiania binarnego i ustawiając tabelę GOT jako tylko do odczytu po tym:

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

Referencje

Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks: