
Gagnant du concours de plugins IDA 2016 ! L'exécution symbolique à un seul clic !
Ponce (prononcé [ 'poN θe ] pon-they) est un plugin IDA Pro qui permet aux utilisateurs d'effectuer facilement et intuitivement de l'analyse de propagation (taint) et de l'exécution symbolique sur des binaires. Avec Ponce, vous êtes à un clic d'obtenir toute la puissance de l'exécution symbolique de pointe. Entièrement écrit en C/C++.
L'exécution symbolique n'est pas un nouveau concept dans la communauté de la sécurité. Elle existe depuis de nombreuses années, mais ce n'est qu'aux alentours de 2015 que des projets open source comme Triton et Angr ont été créés pour répondre à ce besoin. Malgré la disponibilité de ces projets, les utilisateurs finaux sont souvent laissés pour implémenter eux-mêmes des cas d'utilisation spécifiques.
Nous avons répondu à ces besoins en créant Ponce, un plugin IDA qui implémente l'exécution symbolique et l'analyse de propagation dans le désassembleur/débogueur le plus utilisé par les ingénieurs en rétro-ingénierie.
Ponce fonctionne à la fois avec des binaires x86 et x64 dans n'importe quelle version d'IDA >= 7.0. Installer le plugin est aussi simple que de copier les fichiers appropriés depuis les dernières versions dans le dossier plugins\ de votre répertoire d'installation d'IDA.
Assurez-vous d'utiliser le binaire Ponce compilé pour votre version d'IDA afin d'éviter toute incompatibilité.
Ponce fonctionne nativement sous Windows, Linux et OSX !
Le plugin s'exécutera automatiquement, vous guidant à travers la configuration initiale la première fois qu'il est exécuté. La configuration sera sauvegardée dans un fichier de configuration, vous n'aurez donc plus à vous soucier de la fenêtre de configuration.
Dans le gif suivant, nous voyons l'utilisation de la propagation automatique et comment nous pouvons nier une condition et l'injecter en mémoire pendant le débogage :
argv.elite qui a été injectée en mémoire et atteignons ainsi le code Win.Le code source du crackme peut être trouvé ici

Dans cet exemple, nous voyons l'utilisation du moteur de propagation avec cmake. Nous :
\``fread()```` lit depuis le fichier.
Dans l'exemple suivant, nous utilisons le moteur d'instantané (snapshot) :
\``fread()```` lit depuis le fichier.
Le code source de l'exemple peut être trouvé ici
Dans cette section, nous listons les différentes options de Ponce ainsi que les raccourcis clavier :













Ponce s'appuie sur le framework Triton pour fournir la sémantique, l'analyse de propagation et l'exécution symbolique. Triton est un superbe projet Open Source sponsorisé par Quarkslab et maintenu principalement par Jonathan Salwan avec une bibliothèque riche. Nous tenons à remercier et à approuver le travail de Jonathan avec Triton. Vous déchirez ! :)
Depuis Ponce v0.3, nous avons migré le processus de compilation pour utiliser CMake. Cela unifie la façon dont la configuration et la construction se déroulent sous Linux, Windows et OSX. Nous supportons désormais l'affichage de commentaires dans le pseudo-code concernant les instructions symboliques ou taintées. Pour que cette fonctionnalité fonctionne, vous devez ajouter hexrays.hpp à votre dossier d'inclusion IDA SDK. hexrays.hpp se trouve dans plugins/hexrays_sdk/ de votre chemin d'installation d'IDA. Si vous n'avez pas acheté le décompilateur hex-rays, vous pouvez toujours construire Ponce en utilisant -DBUILD_HEXRAYS_SUPPORT=OFF. Nous utilisons Github Actions comme environnement CI. Consultez les fichiers d'action si vous voulez comprendre comment se déroule le processus de construction.
Juan Ponce de León (1474 – juillet 1521) était un explorateur et conquistador espagnol. Il a découvert la Floride aux États-Unis. Le plugin IDA vous aidera à découvrir, explorer et, espérons-le, conquérir les différents chemins dans un binaire.
Oui, vous pouvez utiliser Ponce nativement dans IDA pour Windows ou vous attacher à distance à une machine Linux ou OS X et l'utiliser. Dans la prochaine version de Ponce, nous supporterons nativement Ponce pour les versions Linux et OS X d'IDA.
Dans nos tests, nous atteignons 3000 instructions par seconde. Nous prévoyons d'utiliser le tracer PIN qu'IDA propose pour augmenter la vitesse.
Ouvrez un issue, nous le résoudrons ASAP ;)
Bien sûr ! N'hésitez pas à faire des pull requests et à travailler sur les issues ouvertes. Nous vous paierons en bières pour votre aide ;)
L'exécution concolique et Ponce présentent quelques problèmes :
Chargement/écriture mémoire symbolique : lorsque l'indice utilisé pour lire une valeur mémoire est symbolique, comme dans x = tableau[index_symbolique], certains problèmes peuvent survenir, pouvant entraîner la perte de trace de l'entrée utilisateur taintée/symbolisée.
Triton ne fonctionne pas très bien avec les instructions à virgule flottante.
L'exécution concolique n'analyse que les instructions exécutées. Cela signifie que le suivi symbolique est perdu dans des cas comme le suivant :
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!
}