Spedi é um desmontador especulativo para o Thumb ISA de tamanho variável. Dado um arquivo ELF como entrada, o Spedi pode:
Spedi funciona diretamente no binário sem usar informações de símbolos. Descobrimos que o Spedi superou o IDA Pro em nossos experimentos.
Spedi recupera todos os Blocos Básicos (BBs) possíveis disponíveis no binário. BBs que compartilham a mesma instrução de salto são agrupados em um Bloco Máximo (MB). Em seguida, os MBs são refinados usando análise de sobreposição e conflito de CFG. Detalhes podem ser encontrados em nosso artigo CASES'16 " Desmontagem especulativa de código binário ". O documento está disponível aqui.
Spedi recupera (quase) perfeitamente instruções de montagem de nossos binários de benchmarks com média de 99,96%. Em comparação, o IDA Pro tem uma média de 95,83% distorcida pelo desempenho relativamente fraco no benchmark sha .
Spedi recupera com precisão 97,46% das funções em média. Ou seja, identifica o endereço inicial e o endereço final corretos. Compare isso com a média de 40,53% alcançada pelo IDA Pro.
Uma boa propriedade de nossa técnica é que ela também é rápida e se adapta bem com o aumento do tamanho do benchmark. Por exemplo, spedi desmonta du (instruções de 50K) em cerca de 150 ms. Observe que há um bom espaço para otimizações adicionais.
Para citar o Spedi em um trabalho acadêmico utilize:
@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},
}
Construa o projeto e experimente-o em um dos binários de nosso conjunto de benchmarks disponíveis neste repositório.
O comando a seguir instruirá spedi
a desmontar especulativamente a seção .text
,
$ ./spedi -t -s -f $FILE > speculative.inst
Use o seguinte comando para desmontar a seção .text
com base nos símbolos de mapeamento de código ARM, que fornecem informações básicas sobre as instruções corretas,
$ ./spedi -t -f $FILE > correct.inst
A maneira mais fácil de comparar os dois resultados é usando,
$ diff -y correct.inst speculative.inst | less
Atualmente, você precisa modificar manualmente main.cpp
para mostrar resultados relacionados à tabela de comutação e recuperação do gráfico de chamadas.
Esta ferramenta é uma prova de conceito acadêmica. Atualmente, não está na nossa lista de prioridades. No entanto, existem algumas características que temos em mente para o futuro, nomeadamente:
bx
e blx
) deverão ser analisadas. Este artigo fornece alguns detalhes relacionados. Recentemente, Andriesse et. al. temos trabalhado no Nucleus
, uma ferramenta para identificação de funções em binários x64. Seu artigo " Compiler-Agnostic Function Detection in Binaries " foi aceito no IEEE Euro S&P 2017. Eles usam mais ou menos as mesmas técnicas de identificação de função implementadas no Spedi. Se você estiver interessado no suporte x64, você pode dar uma olhada na ferramenta deles.
Observe, entretanto, que sua ferramenta é baseada na suposição de que compiladores x64 recentes alocam dados de tabela de salto na seção .rodata
. Isso torna a recuperação de instruções significativamente mais fácil, pois pode ser feita de maneira confiável com varredura linear. Em comparação, o Spedi lida com o caso mais geral de código/dados mistos usando desmontagem especulativa.
Este projeto depende da biblioteca de desmontagem Capstone (v3.0.4).