WWW2Exec - GOT/PLT
Tip
Impara e pratica il hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Impara e pratica il hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al đŹ gruppo Discord o al gruppo telegram o seguici su Twitter đŚ @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos github.
Informazioni di Base
GOT: Tabella degli Offset Globale
La Tabella degli Offset Globale (GOT) è un meccanismo utilizzato nei binari collegati dinamicamente per gestire gli indirizzi delle funzioni esterne. PoichÊ questi indirizzi non sono noti fino al runtime (a causa del collegamento dinamico), la GOT fornisce un modo per aggiornare dinamicamente gli indirizzi di questi simboli esterni una volta risolti.
Ogni voce nella GOT corrisponde a un simbolo nelle librerie esterne che il binario può chiamare. Quando una funzione viene chiamata per la prima volta, il suo indirizzo effettivo viene risolto dal linker dinamico e memorizzato nella GOT. Le chiamate successive alla stessa funzione utilizzano lâindirizzo memorizzato nella GOT, evitando cosĂŹ il sovraccarico di risolvere nuovamente lâindirizzo.
PLT: Tabella di Collegamento delle Procedure
La Tabella di Collegamento delle Procedure (PLT) lavora a stretto contatto con la GOT e funge da trampolino per gestire le chiamate a funzioni esterne. Quando un binario chiama una funzione esterna per la prima volta, il controllo viene passato a una voce nella PLT associata a quella funzione. Questa voce PLT è responsabile dellâinvocazione del linker dinamico per risolvere lâindirizzo della funzione se non è giĂ stato risolto. Dopo che lâindirizzo è stato risolto, viene memorizzato nella GOT.
Pertanto, le voci della GOT vengono utilizzate direttamente una volta che lâindirizzo di una funzione o variabile esterna è stato risolto. Le voci PLT vengono utilizzate per facilitare la risoluzione iniziale di questi indirizzi tramite il linker dinamico.
Ottenere Esecuzione
Controlla la GOT
Ottieni lâindirizzo della tabella GOT con: objdump -s -j .got ./exec
.png)
Osserva come dopo il caricamento dellâeseguibile in GEF puoi vedere le funzioni che sono nella GOT: gef⤠x/20x 0xADDR_GOT
 (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) (2) (2) (2).png)
Utilizzando GEF puoi iniziare una sessione di debug ed eseguire got per vedere la tabella got:
.png)
GOT2Exec
In un binario la GOT ha gli indirizzi delle funzioni o della sezione PLT che caricherĂ lâindirizzo della funzione. Lâobiettivo di questa scrittura arbitraria è sovrascrivere una voce GOT di una funzione che verrĂ eseguita successivamente con lâindirizzo della PLT della funzione system ad esempio.
Idealmente, dovresti sovrascrivere la GOT di una funzione che verrĂ chiamata con parametri controllati da te (in modo da poter controllare i parametri inviati alla funzione system).
Se system non è utilizzato dal binario, la funzione system non avrĂ una voce nella PLT. In questo scenario, dovrai prima fare un leak dellâindirizzo della funzione system e poi sovrascrivere la GOT per puntare a questo indirizzo.
Puoi vedere gli indirizzi PLT con objdump -j .plt -d ./vuln_binary
voci GOT di libc
La GOT di libc è solitamente compilata con RELRO parziale, rendendola un buon obiettivo per questo supponendo sia possibile capire il suo indirizzo (ASLR).
Le funzioni comuni di libc chiameranno altre funzioni interne le cui GOT potrebbero essere sovrascritte per ottenere lâesecuzione del codice.
Trova maggiori informazioni su questa tecnica qui.
Free2system
Nelle CTF di sfruttamento dellâheap è comune poter controllare il contenuto dei chunk e a un certo punto persino sovrascrivere la tabella GOT. Un trucco semplice per ottenere RCE se i gadget non sono disponibili è sovrascrivere lâindirizzo GOT di free per puntare a system e scrivere allâinterno di un chunk "/bin/sh". In questo modo, quando questo chunk viene liberato, eseguirĂ system("/bin/sh").
Strlen2system
Unâaltra tecnica comune è sovrascrivere lâindirizzo GOT di strlen per puntare a system, quindi se questa funzione viene chiamata con input dellâutente è possibile passare la stringa "/bin/sh" e ottenere una shell.
Inoltre, se puts viene utilizzato con input dellâutente, è possibile sovrascrivere lâindirizzo GOT di strlen per puntare a system e passare la stringa "/bin/sh" per ottenere una shell perchĂŠ puts chiamerĂ strlen con lâinput dellâutente.
One Gadget
Abusare della GOT dallâHeap
Un modo comune per ottenere RCE da una vulnerabilitĂ dellâheap è abusare di un fastbin in modo da poter aggiungere la parte della tabella GOT nel fast bin, cosĂŹ ogni volta che quel chunk viene allocato sarĂ possibile sovrascrivere il puntatore di una funzione, di solito free.
Poi, puntando free a system e liberando un chunk dove è stato scritto /bin/sh\x00 eseguirà una shell.
Ă possibile trovare un esempio qui.
Protezioni
La protezione Full RELRO è progettata per proteggere contro questo tipo di tecnica risolvendo tutti gli indirizzi delle funzioni quando il binario viene avviato e rendendo la tabella GOT di sola lettura dopo:
Riferimenti
- 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
Impara e pratica il hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Impara e pratica il hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al đŹ gruppo Discord o al gruppo telegram o seguici su Twitter đŚ @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos github.
HackTricks

