WWW2Exec - GOT/PLT
Last updated
Last updated
Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Global Offset Table (GOT) to mechanizm używany w dynamicznie linkowanych binariach do zarządzania adresami funkcji zewnętrznych. Ponieważ te adresy nie są znane aż do czasu wykonania (z powodu dynamicznego linkowania), GOT zapewnia sposób na dynamiczne aktualizowanie adresów tych zewnętrznych symboli po ich rozwiązaniu.
Każdy wpis w GOT odpowiada symbolowi w zewnętrznych bibliotekach, które może wywołać binarne. Gdy funkcja jest wywoływana po raz pierwszy, jej rzeczywisty adres jest rozwiązywany przez dynamiczny linker i przechowywany w GOT. Kolejne wywołania tej samej funkcji korzystają z adresu przechowywanego w GOT, unikając w ten sposób narzutu związanego z ponownym rozwiązywaniem adresu.
Procedure Linkage Table (PLT) działa ściśle z GOT i służy jako trampolina do obsługi wywołań funkcji zewnętrznych. Gdy binarne wywołuje funkcję zewnętrzną po raz pierwszy, kontrola jest przekazywana do wpisu w PLT powiązanego z tą funkcją. Ten wpis PLT jest odpowiedzialny za wywołanie dynamicznego linkera w celu rozwiązania adresu funkcji, jeśli nie został on jeszcze rozwiązany. Po rozwiązaniu adresu jest on 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 pośrednictwem dynamicznego linkera.
Uzyskaj adres do tabeli GOT za pomocą: objdump -s -j .got ./exec
Zauważ, jak po załadowaniu wykonywalnego w GEF możesz zobaczyć funkcje, które są w GOT: gef➤ x/20x 0xADDR_GOT
Korzystając z GEF, możesz rozpocząć sesję debugowania i wykonać got
, aby zobaczyć tabelę got:
W binarnym GOT ma adresy do funkcji lub do sekcji PLT, która załaduje adres funkcji. Celem tego arbitralnego zapisu jest nadpisanie wpisu GOT funkcji, która ma być wykonana później za pomocą adresu PLT funkcji system
na przykład.
Idealnie, będziesz nadpisywać GOT funkcji, która ma być wywołana z parametrami kontrolowanymi przez Ciebie (więc będziesz mógł kontrolować parametry wysyłane do funkcji system).
Jeśli system
nie jest używane przez binarne, funkcja system nie będzie miała wpisu w PLT. W tym scenariuszu będziesz musiał najpierw wycieknąć 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
GOT libc jest zazwyczaj kompilowane z częściowym RELRO, co czyni go dobrym celem dla tego, zakładając, że możliwe jest ustalenie jego adresu (ASLR).
Typowe funkcje libc będą wywoływać inne funkcje wewnętrzne, których GOT mogłoby być nadpisane w celu uzyskania wykonania kodu.
Znajdź więcej informacji na temat tej techniki tutaj.
W eksploatacji heap w CTF często można kontrolować zawartość kawałków i w pewnym momencie nawet nadpisać tabelę GOT. Prosty trik, aby uzyskać RCE, jeśli gadżety nie są dostępne, to nadpisać adres GOT free
, aby wskazywał na system
i zapisać w kawałku "/bin/sh"
. W ten sposób, gdy ten kawałek zostanie zwolniony, wykona system("/bin/sh")
.
Inną powszechną techniką jest nadpisanie adresu GOT strlen
, aby wskazywał na system
, więc jeśli ta funkcja jest wywoływana z danymi wejściowymi użytkownika, możliwe jest przekazanie ciągu "/bin/sh"
i uzyskanie powłoki.
Ponadto, jeśli puts
jest używane z danymi wejściowymi użytkownika, możliwe jest nadpisanie adresu GOT strlen
, aby wskazywał na system
i przekazanie ciągu "/bin/sh"
, aby uzyskać powłokę, ponieważ puts
wywoła strlen
z danymi wejściowymi użytkownika.
Powszechnym sposobem uzyskania RCE z podatności na heap jest nadużycie fastbina, aby można było dodać część tabeli GOT do fastbina, więc za każdym razem, gdy ten kawałek jest przydzielany, możliwe będzie nadpisanie wskaźnika funkcji, zazwyczaj free
.
Następnie, wskazując free
na system
i zwalniając kawałek, w którym zapisano /bin/sh\x00
, wykona powłokę.
Możliwe jest znalezienie przykładu tutaj.
Ochrona Full RELRO ma na celu ochronę przed tego rodzaju techniką, rozwiązując wszystkie adresy funkcji, gdy binarne jest uruchamiane i czyniąc tabelę GOT tylko do odczytu po tym:
RelroUcz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)