Ponce
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++.
Pourquoi ?
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.
Installation
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é.
Support OS
Ponce fonctionne nativement sous Windows, Linux et OSX !
Cas d'utilisation
- Développement d'exploits : Ponce peut vous aider à créer un exploit de manière bien plus efficace, car le développeur d'exploit peut facilement voir quelles parties de la mémoire et quels registres sont contrôlés, ainsi que les adresses possibles pouvant être utilisées comme gadgets ROP.
- Analyse de malware : Une autre utilisation de Ponce concerne le code malveillant. L'analyse des commandes prises en charge par une famille particulière de malware est facilement déterminée en symbolisant une commande connue simple et en niant toutes les conditions où la commande est vérifiée.
- Rétro-ingénierie de protocole : L'une des utilisations les plus intéressantes de Ponce est la possibilité de reconnaître les nombres magiques, les en-têtes ou même des protocoles entiers requis pour une entrée utilisateur contrôlée. Par exemple, Ponce peut vous aider à lister tous les arguments acceptés pour un binaire en ligne de commande donné ou à extraire le format de fichier requis pour un analyseur de fichier spécifique.
- CTF : Ponce accélère le processus de rétro-ingénierie des binaires pendant les CTF. Comme Ponce est totalement intégré à IDA, vous n'avez pas à vous soucier du temps de configuration. Il est prêt à être utilisé !
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.
Modes d'utilisation
- Moteur de propagation (taint) : Ce moteur est utilisé pour déterminer à chaque étape de l'exécution du binaire quelles parties de la mémoire et quels registres sont contrôlables par l'entrée utilisateur.
- Moteur symbolique : Ce moteur maintient un état symbolique des registres et d'une partie de la mémoire à chaque étape du chemin d'exécution d'un binaire.
Exemples
Nier et injecter une condition
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 :
- Nous sélectionnons le moteur symbolique et définissons l'option pour symboliser
argv.
- Nous identifions la condition qui doit être satisfaite pour gagner le crackMe.
- Nous nions et injectons la solution à chaque fois qu'un octet de notre entrée est vérifié par rapport à la clé.
- Enfin, nous obtenons la clé
elite qui a été injectée en mémoire et atteignons ainsi le code Win.
Le code source du crackme peut être trouvé ici

Utilisation du moteur de propagation pour suivre l'entrée contrôlée par l'utilisateur
Dans cet exemple, nous voyons l'utilisation du moteur de propagation avec cmake. Nous :
- Passons un fichier en argument à cmake pour qu'il le parse.
- Sélectionnons le moteur de propagation.
- Taintons le tampon que
\``fread()```` lit depuis le fichier.
- Reprenons l'exécution sous le contrôle du débogueur pour voir où l'entrée taintée est déplacée.
- Ponce renommera les fonctions taintées. Ce sont les fonctions sur lesquelles l'utilisateur a une influence, et non les fonctions simplement exécutées.

Utilisation de Nier, Injecter & Restaurer
Dans l'exemple suivant, nous utilisons le moteur d'instantané (snapshot) :
- Passons un fichier en argument.
- Sélectionnons le moteur symbolique.
- Taintons le tampon que
\``fread()```` lit depuis le fichier.
- Créons un instantané dans la fonction qui parse le tampon lu depuis le fichier.
- Lorsqu'une condition est évaluée, nous la nions, injectons la solution en mémoire et restaurons l'instantané avec celle-ci.
- La solution sera "valide", donc nous satisferons les conditions existantes.
Le code source de l'exemple peut être trouvé ici
Utilisation
Dans cette section, nous listons les différentes options de Ponce ainsi que les raccourcis clavier :
- Accéder à la configuration et aux fenêtres de propagation/symbolisation : Edit > Ponce > Show Config (Ctl+Shift+P et Ctl+Alt+T)

- Activer/Désactiver le traçage Ponce (Ctl+Shift+E)

- Symboliser/tainter un registre (Ctl+Shift+R)

- Symboliser/tainter la mémoire. Peut être fait depuis la Vue IDA ou la Vue Hex (Ctl+Shift+M)