
Vincitore del concorso plugin IDA 2016! Esecuzione Simbolica a un clic di distanza!
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++.
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.
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à.
Ponce funziona nativamente su Windows, Linux e OSX!
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.
Nel prossimo GIF possiamo vedere l'uso del taint automatico e come possiamo negare una condizione e iniettarla in memoria durante il debug:
argv.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:

Nel prossimo esempio stiamo usando il motore di snapshot:
Il codice sorgente dell'esempio può essere trovato qui
In questa sezione elencheremo le diverse opzioni di Ponce e le scorciatoie da tastiera:













Ponce si basa sul framework Triton per fornire semantica, analisi di taint ed esecuzione simbolica. Triton è un fantastico progetto Open Source sponsorizzato da Quarkslab e mantenuto principalmente da Jonathan Salwan con una ricca libreria. Vorremmo ringraziare e sostenere il lavoro di Jonathan con Triton. Sei grande! :)
Dalla versione 0.3 di Ponce abbiamo spostato il processo di compilazione su CMake. In questo modo unifichiamo il modo in cui la configurazione e la compilazione avvengono per Linux, Windows e OSX. Ora supportiamo la possibilità di fornire feedback sul pseudocodice riguardante le istruzioni simboliche o di taint. Per far funzionare questa funzione, devi aggiungere hexrays.hpp alla cartella include dell'IDA SDK. hexrays.hpp si trova in plugins/hexrays_sdk/ nel percorso di installazione di IDA. Se non hai acquistato il decompilatore hex-rays, puoi comunque compilare Ponce usando -DBUILD_HEXRAYS_SUPPORT=OFF. Usiamo Github Actions come ambiente CI. Controlla i file delle azioni se vuoi capire come avviene il processo di compilazione.
Juan Ponce de León (1474 – luglio 1521) fu un esploratore e conquistatore spagnolo. Scoprì la Florida negli Stati Uniti. Il plugin per IDA ti aiuterà a scoprire, esplorare e si spera conquistare i diversi percorsi in un binario.
Sì, puoi usare Ponce nativamente in IDA per Windows o connetterti in remoto a una macchina Linux o OS X e usarlo. Nella prossima versione di Ponce supporteremo nativamente Ponce per le versioni IDA di Linux e OS X.
Nei nostri test raggiungiamo l'elaborazione di 3000 istruzioni al secondo. Prevediamo di utilizzare il tracciatore PIN offerto da IDA per aumentare la velocità.
Apri un issue, lo risolveremo al più presto ;)
Certo! Per favore, fai pull request e lavora sugli issue aperti. Ti pagheremo in birre per l'aiuto ;)
L'esecuzione concolica e Ponce hanno alcuni problemi:
Carico/scrittura di memoria simbolica: Quando l'indice usato per leggere un valore di memoria è simbolico, come in x = aray[symbolic_index], sorgono alcuni problemi che potrebbero portare alla perdita di traccia dell'input controllato dall'utente taintato/simbolizzato.
Triton non funziona molto bene con le istruzioni in virgola mobile.
L'esecuzione concolica analizza solo le istruzioni eseguite. Ciò significa che il tracciamento simbolico viene perso in casi come il seguente:
int check(char myinput) // Input is symbolic/tainted
{
int flag = 0;
if (myinput == 'A') //This condition is symbolic/tainted
flag = 1
else
flag =- 1;
return flag; // flag is not symbolic/tainted!
}