WWW2Exec - GOT/PLT

Sostieni HackTricks

Informazioni di Base

GOT: Global Offset Table

La Tabella degli Offset Globali (GOT) è un meccanismo utilizzato nei binari collegati dinamicamente per gestire gli indirizzi delle funzioni esterne. Poiché questi indirizzi non sono noti fino all'esecuzione (a causa del collegamento dinamico), la GOT fornisce un modo per aggiornare dinamicamente gli indirizzi di questi simboli esterni una volta che sono risolti.

Ogni voce nella GOT corrisponde a un simbolo nelle librerie esterne che il binario potrebbe chiamare. Quando una funzione viene chiamata per la prima volta, il suo indirizzo effettivo viene risolto dal collegatore dinamico e memorizzato nella GOT. Chiamate successive alla stessa funzione utilizzano l'indirizzo memorizzato nella GOT, evitando così il costo di risolvere nuovamente l'indirizzo.

PLT: Procedure Linkage Table

La Tabella di Collegamento delle Procedure (PLT) lavora strettamente con la GOT e funge da trampolino per gestire le chiamate alle 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 di invocare il collegatore dinamico per risolvere l'indirizzo della funzione se non è stato ancora risolto. Dopo che l'indirizzo è stato risolto, viene memorizzato nella GOT.

Pertanto, le voci della GOT sono utilizzate direttamente una volta che l'indirizzo di una funzione o variabile esterna è risolto. Le voci della PLT sono utilizzate per facilitare la risoluzione iniziale di questi indirizzi tramite il collegatore dinamico.

Esecuzione

Controllare la GOT

Ottieni l'indirizzo della tabella GOT con: objdump -s -j .got ./exec

Osserva come dopo il caricamento dell'eseguibile in GEF puoi vedere le funzioni che sono nella GOT: gef➤ x/20x 0xADDR_GOT

Utilizzando GEF puoi avviare una sessione di debug ed eseguire got per vedere la tabella got:

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 della GOT di una funzione che verrà eseguita successivamente con l'indirizzo del PLT della funzione system per esempio.

Idealmente, si sovrascriverà la GOT di una funzione che verrà chiamata con parametri controllati da te (così potrai controllare i parametri inviati alla funzione di sistema).

Se system non viene utilizzata dal binario, la funzione di sistema non avrà una voce nella PLT. In questo scenario, sarà necessario prima ottenere l'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 di solito è compilata con partial RELRO, rendendola un bel bersaglio per questo supponendo che sia possibile scoprire il suo indirizzo (ASLR).

Le funzioni comuni della libc chiameranno altre funzioni interne le cui GOT potrebbero essere sovrascritte per ottenere l'esecuzione del codice.

Trova ulteriori informazioni su questa tecnica qui.

Free2system

Nei CTF di sfruttamento della heap è comune poter controllare il contenuto dei chunk e a un certo punto sovrascrivere la tabella GOT. Un semplice trucco per ottenere RCE se non sono disponibili gadget è 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 strlen GOT per puntare a system, quindi se questa funzione viene chiamata con input utente è possibile passare la stringa "/bin/sh" e ottenere una shell.

Inoltre, se puts viene utilizzato con input 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 utente.

One Gadget

One Gadget

Abuso della GOT dalla Heap

Un modo comune per ottenere RCE da una vulnerabilità della heap è sfruttare un fastbin in modo da poter aggiungere la parte della tabella GOT nel fast bin, quindi ogni volta che quel chunk viene allocato sarà possibile sovrascrivere il puntatore di una funzione, di solito free. Quindi, puntando free a system e liberando un chunk dove è stata scritta /bin/sh\x00 eseguirà una shell.

È possibile trovare un esempio qui.

Protezioni

La protezione Full RELRO è progettata per proteggere da questo tipo di tecnica risolvendo tutti gli indirizzi delle funzioni quando il binario viene avviato e rendendo la tabella GOT di sola lettura dopo di esso:

Relro

References

Supporta HackTricks

Last updated