Spedi es un desensamblador especulativo para el Thumb ISA de tamaño variable. Dado un archivo ELF como entrada, Spedi puede:
Spedi trabaja directamente en el binario sin utilizar información de símbolos. Descubrimos que Spedi supera a IDA Pro en nuestros experimentos.
Spedi recupera todos los posibles bloques básicos (BB) disponibles en el binario. Los BB que comparten la misma instrucción de salto se agrupan en un Bloque Máximo (MB). Luego, los MB se refinan mediante análisis de conflictos de superposición y CFG. Los detalles se pueden encontrar en nuestro artículo de CASES'16 " Desmontaje especulativo del código binario ". El documento está disponible aquí.
Spedi recupera (casi) perfectamente las instrucciones de ensamblaje de nuestros binarios de referencia con un promedio del 99,96%. En comparación, IDA Pro tiene un promedio de 95,83% sesgado por el desempeño relativamente pobre en el índice de referencia sha .
Spedi recupera precisamente el 97,46% de las funciones de media. Es decir, identifica la dirección inicial y final correcta. Compare eso con el promedio del 40,53% logrado por IDA Pro.
Una buena propiedad de nuestra técnica es que también es rápida y escala bien con un mayor tamaño de referencia. Por ejemplo, spedi desmonta du (50.000 instrucciones) en unos 150 ms. Tenga en cuenta que hay mucho margen para futuras optimizaciones.
Para citar a Spedi en un trabajo académico utilice:
@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},
}
Construya el proyecto y pruébelo en uno de los archivos binarios de nuestro conjunto de pruebas disponibles en este repositorio.
El siguiente comando le indicará spedi
que desmonte especulativamente la sección .text
,
$ ./spedi -t -s -f $FILE > speculative.inst
Utilice el siguiente comando para desmontar la sección .text
basada en los símbolos de mapeo del código ARM que proporciona la verdad sobre las instrucciones correctas.
$ ./spedi -t -f $FILE > correct.inst
La forma más sencilla de comparar ambas salidas es utilizando,
$ diff -y correct.inst speculative.inst | less
Actualmente, necesita modificar manualmente main.cpp
para mostrar los resultados relacionados con la tabla de cambios y la recuperación del gráfico de llamadas.
Esta herramienta es una prueba de concepto académica. Actualmente, no está en nuestra lista de prioridades. Sin embargo, hay ciertas características que tenemos en mente para el futuro, a saber:
bx
y blx
). Este artículo proporciona algunos detalles relacionados. Recientemente, Andriesse et. Alabama. He estado trabajando en Nucleus
, una herramienta para la identificación de funciones en binarios x64. Su artículo " Detección de funciones independientes del compilador en binarios " fue aceptado en IEEE Euro S&P 2017. Utilizan más o menos las mismas técnicas de identificación de funciones implementadas en Spedi. Si está interesado en la compatibilidad con x64, puede echar un vistazo a su herramienta.
Sin embargo, tenga en cuenta que su herramienta se basa en la suposición de que los compiladores x64 recientes asignan datos de tabla de salto en la sección .rodata
. Esto hace que la recuperación de instrucciones sea mucho más fácil, ya que se puede realizar de forma fiable con barrido lineal. En comparación, Spedi maneja el caso más general de código/datos mixtos mediante desensamblaje especulativo.
Este proyecto depende de la biblioteca de desmontaje de Capstone (v3.0.4).