
Un plugin pour introduire des symboles interactifs dans votre débogueur depuis votre décompilateur.
L'ingénierie inverse implique à la fois de l'analyse statique (décompilateur) et dynamique (débogueur), pourtant nous utilisons souvent ces analyses sans partager les connaissances entre les deux. Dans le cas de l'analyse de binaires statiques, le changement de contexte entre l'assembleur du débogueur et les symboles que vous avez inversés dans la décompilation peut être inefficace.
decomp2dbg vise à réduire l'écart de changement de contexte entre le décompilateur et le débogueur en introduisant une API générique pour la synchronisation des symboles du décompilateur vers le débogueur. En effet, cela donne au reverser la puissance de son débogueur avec les symboles et les lignes de décompilation qu'il récupère dans son décompilateur.

Intéressé à voir ce à quoi ressemble decomp2dbg en pratique ? Consultez la présentation enregistrée à CactusCon 2023, qui présente le débogage d'un binaire arm32 distant depuis une machine x64 avec les symboles de Ghidra.
Pour une aide active, rejoignez le Discord BinSync ci-dessous, où nous répondons aux questions sur decomp2dbg :
Installez via pip, puis utilisez l'installateur intégré pour les décompilateurs :
pip3 install decomp2dbg && decomp2dbg --install
Cela ouvrira une invite où il vous sera demandé de saisir le chemin de votre décompilateur et de votre débogueur de choix.
Pour Ghidra, vous devrez lancer en mode PyGhidra et activer le plugin (d2d_client.py), comme indiqué ici.
Si vous avez installé le côté décompilateur via le gestionnaire de plugins de Binja, vous devez quand même installer le côté débogueur avec la commande ci-dessus.
Remarque : vous devez installer decomp2dbg dans le même environnement Python que votre décompilateur et votre débogueur.
Remarque : Vous devrez peut-être autoriser les connexions entrantes sur le port 3662, ou le port que vous utilisez, pour que decomp2dbg se connecte
au décompilateur. Si vous installez decomp2dbg avec GEF ou pwndbg, il est important que dans votre ~/.gdbinit le fichier d2d.py soit sourcé après GEF ou pwndbg.
Ignorez cette section si vous avez pu utiliser l'installation ci-dessus sans erreur. Si vous ne pouvez pas utiliser le script intégré ci-dessus (installation Windows non-WSL pour le décompilateur), suivez les étapes ci-dessous :
Si vous avez uniquement besoin du côté décompilateur, copiez le plugin de décompilateur associé dans le dossier des plugins du décompilateur. Voici comment faire dans IDA :
Tout d'abord, clonez le dépôt :
git clone https://github.com/mahaloz/decomp2dbg.git
Installez :
pip install .
Copiez tous les fichiers serveur :
cp ./decomp2dbg/d2d_server.py /chemin/vers/ida/plugins/
Si vous devez également installer le côté gdb, utilisez la ligne ci-dessous :
cp ./decomp2dbg/d2d_client.py ~/.d2d.py && echo "source ~/.d2d.py" >> ~/.gdbinit
Tout d'abord, démarrez le serveur de décompilation sur votre décompilateur. Il peut être judicieux d'attendre
que votre décompilateur termine son analyse normale avant de le démarrer. Après l'analyse normale, cela peut être fait en utilisant le raccourci clavier Ctrl-Maj-D,
ou en sélectionnant l'onglet decomp2dbg : configurer dans l'onglet des plugins associés. Après avoir démarré le serveur, vous devriez
voir un message dans votre décompilateur :
[+] Starting XMLRPC server: localhost:3662
[+] Registered decompilation server!
Ensuite, dans votre débogueur, exécutez :
decompiler connect <nom_du_decompilateur>
Si vous exécutez le décompilateur sur une machine virtuelle ou une machine différente, vous pouvez éventuellement fournir l'hôte et le port auxquels vous connecter. Voici un exemple :
decompiler connect ida --host 10.211.55.2 --port 3662
Vous pouvez découvrir comment utiliser toutes les commandes en exécutant la commande decompiler avec le drapeau --help.
La première connexion peut prendre jusqu'à 30 secondes pour s'enregistrer en fonction du nombre de variables globales dans le binaire. Si tout se passe bien, vous devriez voir :
[+] Connected to decompiler!
Si vous utilisez decomp2dbg pour une bibliothèque, c'est-à-dire que le binaire principal auquel votre débogueur est attaché n'est pas le binaire pour lequel vous souhaitez le code source, alors vous devriez consulter la section Utilisation avancée - Bibliothèques partagées du readme.
À chaque événement de point d'arrêt, vous verrez maintenant la décompilation affichée, et la ligne sur laquelle vous vous trouvez associée à l'adresse d'arrêt.
Les fonctions et variables globales de votre décompilation sont désormais mappées dans votre GDB comme des symboles normaux au niveau du code source. Cela signifie que les commandes normales de GDB comme l'affichage et l'examen sont natives :
b sub_46340
x/10i sub_46340
p dword_267A2C
x dword_267A2C
Certaines variables stockées localement dans une fonction sont des variables de pile. Pour les variables qui peuvent être mappées sur la pile ou les registres, nous les importons en tant que variables de commodité. Vous pouvez voir leur contenu comme une variable de commodité normale de GDB :
p $v4
Les variables de pile stockeront toujours leur adresse sur la pile. Pour voir quelle valeur se trouve réellement dans cette variable de pile, il suffit de déréférencer la variable :
x $v4
Cela fonctionne également avec les arguments de fonction le cas échéant (les résultats peuvent varier) :
p $a1
Remarque : $v4 dans ce cas ne sera mappé que tant que vous êtes dans la même fonction. Une fois que vous quittez la fonction,
il peut être dé-mappé ou remappé à une autre valeur.
Lorsque vous souhaitez que la décompilation (et les symboles) soit affichée pour une section de mémoire qui n'est pas le binaire principal, comme lors du débogage d'une bibliothèque partagée, vous devez suivre quelques étapes supplémentaires. Actuellement, d2d ne supporte qu'un seul décompilateur connecté à la fois, ce qui signifie que si vous avez actuellement des décompilateurs connectés qui ne sont pas la bibliothèque, vous devez les déconnecter.
Après avoir suivi la configuration normale pour que votre décompilateur exécute le serveur d2d pour votre bibliothèque partagée, vous devez définir manuellement l'adresse de base de cette bibliothèque et son adresse de fin :
decompiler connect ida --base-addr-start 0x00007ffff7452000 --base-addr-end 0x00007ffff766d000
Pour trouver l'adresse de base à laquelle votre bibliothèque est chargée en mémoire, il est recommandé d'utiliser quelque chose comme la commande vmmap de GEF pour rechercher le nom de la bibliothèque dans l'espace mémoire. Après vous être connecté avec cette adresse définie manuellement, les symboles fonctionneront comme d'habitude avec d2d. La décompilation ne sera affichée à l'écran que lorsque vous serez dans la plage de cet espace d'adresses.