Basic Stack Binary Exploitation Methodology
Last updated
Last updated
Impara e pratica Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Impara e pratica Hacking 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 su quando ciascuna tecnica sarà utile. Nota che le stesse protezioni influenzeranno tecniche diverse. Puoi trovare modi per bypassare 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.
Potrebbe essere necessario abusare di un Integer Overflows per causare l'overflow.
O tramite Scritture Arbitrari + Write What Where to Execution.
Stringhe di formato: Abusare di printf
per scrivere contenuti arbitrari in indirizzi arbitrari.
Indicizzazione degli Array: Abusare di un indicizzazione mal progettata per poter controllare alcuni array e ottenere una scrittura arbitraria.
Potrebbe essere necessario abusare di un Integer Overflows per causare l'overflow.
bof a WWW tramite 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:
Write What Where 2 ExecQualcosa da tenere in considerazione è che di solito una sola exploitation di una vulnerabilità potrebbe non essere sufficiente per eseguire un exploit con successo, specialmente alcune protezioni devono essere bypassate. 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 nell'indirizzo exit
in GOT (o qualsiasi altra funzione utilizzata dal binario prima di terminare) l'indirizzo per tornare alla vulnerabilità.
Come spiegato in .fini_array, memorizza qui 2 funzioni, una per chiamare di nuovo la vuln e un'altra per chiamare __libc_csu_fini
che richiamerà di nuovo la funzione da .fini_array
.
ret2win: C'è una funzione nel codice che devi chiamare (forse con alcuni parametri specifici) per ottenere il flag.
In un bof con PIE, dovrai bypassarlo.
In un bof con canary, dovrai bypassarlo.
Se hai bisogno di 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 tu possa chiamare questa syscall) per controllare molti registri.
Tramite un Write What Where potresti abusare di altre vulnerabilità (non bof) per chiamare la funzione win
.
Puntatori di Redirecting: 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.
(Stack) Shellcode: Questo è utile per memorizzare uno shellcode nello stack prima o dopo aver sovrascritto il puntatore di ritorno e poi saltare a esso per eseguirlo:
In ogni caso, se c'è un canary, in un bof regolare dovrai bypassarlo (leak).
Con ASLR dovrai utilizzare tecniche come ret2esp/ret2reg per saltarci.
Questo mescolerà shellcode con una catena ROP.
Ret2syscall: Utile per chiamare execve
per eseguire comandi arbitrari. Devi 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'
). Devi che il binario carichi la libreria con la funzione che desideri chiamare (libc di solito).
Se compilato staticamente e senza PIE, l'indirizzo di system
e /bin/sh
non cambierà, quindi è possibile usarli staticamente.
Senza ASLR e conoscendo la versione di libc caricata, l'indirizzo di system
e /bin/sh
non cambierà, quindi è possibile usarli staticamente.
Usa ret2dlresolve
per risolvere l'indirizzo di system
e chiamarlo.
Bypassa ASLR e calcola l'indirizzo di system
e '/bin/sh'
in memoria.
Bypassare PIE.
Trovare la versione di libc
utilizzata (leak un paio di indirizzi di funzione).
Controllare gli scenari precedenti con ASLR per continuare.
Stack Pivoting / EBP2Ret / EBP Chaining: Controlla l'ESP per controllare RET tramite l'EBP memorizzato nello stack.
Utile per off-by-one stack overflows.
Utile come modo alternativo per controllare EIP mentre si abusa di EIP per costruire il payload in memoria e poi saltarci tramite EBP.
Puntatori di Redirecting: 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.
Impara e pratica Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Impara e pratica Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)