Ponce
Ponce (pronunciato [ 'poN θe ] pon-they ) è un plugin per IDA Pro che fornisce agli utenti la possibilità di eseguire l'analisi di taint e l'esecuzione simbolica su binari in modo facile e intuitivo. Con Ponce sei a un clic di distanza da tutta la potenza dell'esecuzione simbolica all'avanguardia. Interamente scritto in C/C++.
Perché?
L'esecuzione simbolica non è un concetto nuovo nella comunità della sicurezza. Esiste da molti anni, ma solo intorno al 2015 progetti open source come Triton e Angr sono stati creati per affrontare questa esigenza. Nonostante la disponibilità di questi progetti, spesso gli utenti finali devono implementare da soli casi d'uso specifici.
Abbiamo affrontato queste esigenze creando Ponce, un plugin per IDA che implementa l'esecuzione simbolica e l'analisi di taint all'interno del disassemblatore/debugger più utilizzato dai reverse engineer.
Installazione
Ponce funziona con binari x86 e x64 in qualsiasi versione di IDA >= 7.0. Installare il plugin è semplice come copiare i file appropriati dalle ultime build nella cartella plugins\ nella directory di installazione di IDA.
Assicurati di utilizzare il binario di Ponce compilato per la tua versione di IDA per evitare incompatibilità.
Supporto OS
Ponce funziona nativamente su Windows, Linux e OSX!
Casi d'uso
- Sviluppo di exploit: Ponce può aiutarti a creare un exploit in modo molto più efficiente, poiché lo sviluppatore di exploit può vedere facilmente quali parti della memoria e quali registri controlli, nonché gli indirizzi possibili che possono essere sfruttati come gadget ROP.
- Analisi malware: Un altro uso di Ponce è legato al codice malware. Analizzare i comandi supportati da una particolare famiglia di malware è facilmente determinato simbolizzando un semplice comando noto e negando tutte le condizioni in cui il comando viene verificato.
- Reverse engineering di protocolli: Uno degli usi più interessanti di Ponce è la possibilità di riconoscere magic number, header o persino interi protocolli richiesti per l'input utente controllato. Ad esempio, Ponce può aiutarti a elencare tutti gli argomenti accettati per un dato binario a riga di comando o estrarre il formato file richiesto per un parser di file specifico.
- CTF: Ponce accelera il processo di reverse engineering dei binari durante i CTF. Poiché Ponce è completamente integrato in IDA, non devi preoccuparti dei tempi di configurazione. È pronto per essere utilizzato!
Il plugin verrà eseguito automaticamente, guidandoti attraverso la configurazione iniziale la prima volta che viene eseguito. La configurazione verrà salvata in un file di configurazione, così non dovrai più preoccuparti della finestra di configurazione.
Modalità d'uso
- Motore di taint: Questo motore viene utilizzato per determinare, ad ogni passo dell'esecuzione del binario, quali parti della memoria e dei registri sono controllabili dall'input dell'utente.
- Motore simbolico: Questo motore mantiene uno stato simbolico dei registri e di parte della memoria ad ogni passo nel percorso di esecuzione di un binario.
Esempi
Nega e inietta una condizione
Nel prossimo GIF possiamo vedere l'uso del taint automatico e come possiamo negare una condizione e iniettarla in memoria durante il debug:
- Selezioniamo il motore simbolico e impostiamo l'opzione per simbolizzare
argv.
- Identifichiamo la condizione che deve essere soddisfatta per vincere il crackMe.
- Negliamo e iniettiamo la soluzione ogni volta che un byte del nostro input viene confrontato con la chiave.
- Finalmente otteniamo la chiave
elite che è stata iniettata in memoria e quindi raggiungiamo il codice Win.
Il codice sorgente del crackme può essere trovato qui

In questo esempio possiamo vedere l'uso del motore di taint con cmake. Stiamo:
- Passando un file come argomento a cmake per fargli analizzare il file.
- Selezioniamo che vogliamo usare il motore di taint
- Taintiamo il buffer che ```fread()```` legge dal file.
- Riprendiamo l'esecuzione sotto il controllo del debugger per vedere dove viene spostato l'input taintato.
- Ponce rinominerà le funzioni taintate. Queste sono le funzioni su cui l'utente ha in qualche modo influenza, non le funzioni semplicemente eseguite.

Usa Nega, Inietta e Ripristina
Nel prossimo esempio stiamo usando il motore di snapshot:
- Passando un file come argomento.
- Selezioniamo che vogliamo usare il motore simbolico.
- Taintiamo il buffer che ```fread()```` legge dal file.
- Creiamo uno snapshot nella funzione che analizza il buffer letto dal file.
- Quando una condizione viene valutata, la neghiamo, iniettiamo la soluzione in memoria e ripristiniamo lo snapshot con essa.
- La soluzione sarà 'valida', quindi soddisfaremo le condizioni esistenti.
Il codice sorgente dell'esempio può essere trovato qui
Utilizzo
In questa sezione elencheremo le diverse opzioni di Ponce e le scorciatoie da tastiera:
- Accedi alla configurazione e alle finestre di taint/simbolico: Modifica > Ponce > Mostra Config (Ctrl+Maiusc+P e Ctrl+Alt+T)

- Abilita/Disabilita tracciamento Ponce (Ctrl+Maiusc+E)

- Simbolizza/tainta un registro (Ctrl+Maiusc+R)

- Simbolizza/tainta memoria. Può essere fatto dalla Vista IDA o dalla Vista Hex (Ctrl+Maiusc+M)

