Basic Stack Binary Exploitation Methodology
Last updated
Last updated
Impara e pratica l'Hacking su AWS:HackTricks Training AWS Red Team Expert (ARTE) Impara e pratica l'Hacking su GCP: HackTricks Training GCP Red Team Expert (GRTE)
Prima di iniziare a sfruttare qualsiasi cosa, è interessante comprendere parte della struttura di un binario ELF:
ELF Basic InformationCon così tante tecniche, è utile avere uno schema in cui ogni tecnica sarà utile. Nota che le stesse protezioni influenzeranno diverse tecniche. Puoi trovare modi per aggirare le protezioni in ciascuna sezione di protezione ma non in questa metodologia.
Ci sono diversi modi in cui potresti finire per controllare il flusso di un programma:
Stack Overflows sovrascrivendo il puntatore di ritorno dallo stack o l'EBP -> ESP -> EIP.
Potresti dover abusare di un Integer Overflows per causare l'overflow
Oppure tramite Scritture Arbitrarie + Write What Where to Execution
Stringhe di Formato: Abusare di printf
per scrivere contenuti arbitrari in indirizzi arbitrari.
Indicizzazione di Array: Abusare di un'indicizzazione mal progettata per poter controllare alcuni array e ottenere una scrittura arbitraria.
Potresti dover abusare di un Integer Overflows per causare l'overflow
bof to WWW via ROP: Abusare di un buffer overflow per costruire un ROP e poter ottenere un WWW.
Puoi trovare le tecniche di Write What Where to Execution in:
https://github.com/HackTricks-wiki/hacktricks/blob/it/binary-exploitation/arbitrary-write-2-exec/README.mdQualcosa da tenere in considerazione è che di solito un solo sfruttamento di una vulnerabilità potrebbe non essere sufficiente per eseguire con successo uno sfruttamento, specialmente se alcune protezioni devono essere aggirate. Pertanto, è interessante discutere alcune opzioni per rendere una singola vulnerabilità sfruttabile più volte nella stessa esecuzione del binario:
Scrivere in una catena ROP l'indirizzo della funzione main
o l'indirizzo in cui si verifica la vulnerabilità.
Controllando una corretta catena ROP potresti essere in grado di eseguire tutte le azioni in quella catena
Scrivere l'indirizzo di exit
in GOT (o di qualsiasi altra funzione utilizzata dal binario prima della fine) per tornare all'indirizzo della vulnerabilità
Come spiegato in .fini_array, memorizzare qui 2 funzioni, una per richiamare nuovamente la vulnerabilità e un'altra per richiamare**__libc_csu_fini
** che richiamerà nuovamente la funzione da .fini_array
.
ret2win: C'è una funzione nel codice che devi chiamare (forse con alcuni parametri specifici) per ottenere la flag.
In un bof con PIE, dovrai aggirarlo
In un bof con canary, dovrai aggirarlo
Se devi impostare diversi parametri per chiamare correttamente la funzione ret2win puoi usare:
Una catena ROP se ci sono abbastanza gadget per preparare tutti i parametri
SROP (nel caso in cui puoi chiamare questa syscall) per controllare molti registri
Attraverso un Write What Where potresti abusare di altre vulnerabilità (non bof) per chiamare la funzione win
.
Reindirizzamento dei Puntatori: Nel caso lo stack contenga puntatori a una funzione che verrà chiamata o a una stringa che verrà utilizzata da una funzione interessante (system o printf), è possibile sovrascrivere quell'indirizzo.
Variabili non inizializzate: Non si sa mai.
(Stack) Shellcode: È utile memorizzare uno shellcode nello stack prima o dopo la sovrascrittura del puntatore di ritorno e quindi saltare ad esso per eseguirlo:
In ogni caso, se c'è un canary, in un bof regolare dovrai aggirarlo (leak)
Con ASLR dovrai utilizzare tecniche come ret2esp/ret2reg per saltarci
Questo mescolerà lo shellcode con una catena ROP.
Ret2syscall: Utile per chiamare execve
per eseguire comandi arbitrari. È necessario essere in grado di trovare i gadget per chiamare la syscall specifica con i parametri.
SROP può essere utile per preparare il ret2execve
Ret2lib: Utile per chiamare una funzione da una libreria (di solito da libc
) come system
con alcuni argomenti preparati (ad es. '/bin/sh'
). È necessario che il binario carichi la libreria con la funzione che si desidera chiamare (di solito libc).
Se compilato staticamente e senza PIE, l'indirizzo di system
e /bin/sh
non cambieranno, quindi è possibile utilizzarli staticamente.
Senza ASLR e conoscendo la versione di libc caricata, l'indirizzo di system
e /bin/sh
non cambieranno, quindi è possibile utilizzarli staticamente.
Utilizzare ret2dlresolve
per risolvere l'indirizzo di system
e chiamarlo
Eludere ASLR e calcolare l'indirizzo di system
e '/bin/sh'
in memoria.
Eludere PIE
Trovare la versione di libc
utilizzata (leak di un paio di indirizzi di funzione)
Controllare i casi precedenti con ASLR per continuare.
Stack Pivoting / EBP2Ret / EBP Chaining: Controlla l'ESP per controllare RET attraverso l'EBP memorizzato nello stack.
Utile per stack overflow off-by-one
Utile come modo alternativo per controllare EIP mentre si abusa di EIP per costruire il payload in memoria e quindi saltare ad esso tramite EBP
Riorientamento dei puntatori: Nel caso in cui lo stack contenga puntatori a una funzione che verrà chiamata o a una stringa che verrà utilizzata da una funzione interessante (system o printf), è possibile sovrascrivere quell'indirizzo.
Variabili non inizializzate: Non si sa mai