Spedi est un désassembleur spéculatif pour le Thumb ISA à taille variable. Étant donné un fichier ELF en entrée, Spedi peut :
Spedi fonctionne directement sur le binaire sans utiliser d'informations sur les symboles. Nous avons constaté que Spedi surpassait IDA Pro dans nos expériences.
Spedi récupère tous les blocs de base (BB) possibles disponibles dans le binaire. Les BB qui partagent la même instruction de saut sont regroupés dans un bloc maximal (MB). Ensuite, les MB sont affinés à l’aide d’une analyse de chevauchement et de conflit CFG. Les détails peuvent être trouvés dans notre article CASES'16 " Démontage spéculatif du code binaire ". Le document est disponible ici.
Spedi récupère (presque) parfaitement les instructions d'assemblage de nos binaires de benchmarks avec une moyenne de 99,96%. En comparaison, IDA Pro a une moyenne de 95,83 % faussée par les performances relativement médiocres du benchmark sha .
Spedi récupère justement 97,46% des fonctions en moyenne. Autrement dit, il identifie l'adresse de début et l'adresse de fin correctes. Comparez cela à la moyenne de 40,53 % obtenue par IDA Pro.
Une propriété intéressante de notre technique est qu'elle est également rapide et s'adapte bien à une taille de référence accrue. Par exemple, spedi démonte du (instructions 50K) en 150 ms environ. Notez qu'il existe une bonne marge pour d'autres optimisations.
Pour citer Spedi dans un ouvrage académique, veuillez utiliser :
@inproceedings{BenKhadraSK2016,
author = {Ben Khadra, M. Ammar and Stoffel, Dominik and Kunz, Wolfgang},
title = {Speculative Disassembly of Binary Code},
booktitle = {Proceedings of the International Conference on Compilers, Architectures and Synthesis for Embedded Systems},
year = {2016},
location = {Pittsburgh, Pennsylvania},
articleno = {16},
doi = {10.1145/2968455.2968505},
acmid = {2968505},
publisher = {ACM},
}
Construisez le projet et essayez-le sur l'un des binaires de notre suite de benchmark disponible dans ce référentiel.
La commande suivante demandera spedi
de désassembler de manière spéculative la section .text
,
$ ./spedi -t -s -f $FILE > speculative.inst
Utilisez la commande suivante pour désassembler la section .text
basée sur les symboles de mappage de code ARM qui fournit la vérité fondamentale sur les instructions correctes,
$ ./spedi -t -f $FILE > correct.inst
Le moyen le plus simple de comparer les deux résultats consiste à utiliser :
$ diff -y correct.inst speculative.inst | less
Actuellement, vous devez modifier manuellement main.cpp
pour afficher les résultats liés à la récupération de la table de commutation et du graphique d'appel.
Cet outil est une preuve de concept académique. Actuellement, ce n'est pas sur notre liste de priorités. Cependant, nous avons certaines fonctionnalités en tête pour l’avenir, à savoir :
bx
et blx
) devraient être analysées. Cet article fournit quelques détails connexes. Récemment, Andriesse et. al. ont travaillé sur Nucleus
, un outil d'identification de fonctions dans les binaires x64. Leur article « Compiler-Agnostic Function Detection in Binaries » a été accepté à l'IEEE Euro S&P 2017. Ils utilisent plus ou moins les mêmes techniques d'identification de fonctions mises en œuvre dans Spedi. Si vous êtes intéressé par le support x64, vous pouvez consulter leur outil.
Notez cependant que leur outil est basé sur l'hypothèse que les compilateurs x64 récents allouent des données de table de saut dans la section .rodata
. Cela rend la récupération des instructions beaucoup plus facile puisqu'elle peut être effectuée de manière fiable avec un balayage linéaire. En comparaison, Spedi traite le cas plus général du code/données mixtes en utilisant le désassemblage spéculatif.
Ce projet dépend de la bibliothèque de désassemblage Capstone (v3.0.4).