Spedi ist ein spekulativer Disassembler für den Thumb ISA variabler Größe. Mit einer ELF-Datei als Eingabe kann Spedi:
Spedi arbeitet direkt mit der Binärdatei, ohne Symbolinformationen zu verwenden. Wir haben in unseren Experimenten festgestellt, dass Spedi IDA Pro übertrifft.
Spedi stellt alle möglichen Basisblöcke (BBs) wieder her, die in der Binärdatei verfügbar sind. BBs, die denselben Sprungbefehl haben, werden in einem Maximalblock (MB) gruppiert. Anschließend werden die MBs mithilfe der Überlappungs- und CFG-Konfliktanalyse verfeinert. Einzelheiten finden Sie in unserem CASES'16-Artikel „ Spekulative Disassemblierung von Binärcode “. Das Papier gibt es hier.
Spedi stellt Montageanweisungen (fast) perfekt aus unseren Benchmark-Binärdateien wieder her, mit einem Durchschnitt von 99,96 %. Im Vergleich dazu weist IDA Pro einen Durchschnittswert von 95,83 % auf, was auf die relativ schlechte Leistung im SHA -Benchmark zurückzuführen ist.
Spedi stellt durchschnittlich 97,46 % der Funktionen präzise wieder her. Das heißt, es identifiziert die richtige Startadresse und Endadresse. Vergleichen Sie das mit dem Durchschnitt von 40,53 %, der von IDA Pro erreicht wurde.
Eine schöne Eigenschaft unserer Technik ist, dass sie auch schnell ist und sich gut mit größerer Benchmark-Größe skalieren lässt. Spedi zerlegt beispielsweise du (50K-Anweisungen) in etwa 150 ms. Beachten Sie, dass noch viel Raum für weitere Optimierungen besteht.
Um Spedi in einer wissenschaftlichen Arbeit zu zitieren, verwenden Sie bitte:
@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},
}
Erstellen Sie das Projekt und testen Sie es mit einer der Binärdateien unserer Benchmark-Suite, die in diesem Repository verfügbar sind.
Der folgende Befehl weist spedi
an, den .text
-Abschnitt spekulativ zu zerlegen.
$ ./spedi -t -s -f $FILE > speculative.inst
Verwenden Sie den folgenden Befehl, um den .text
Abschnitt basierend auf ARM-Code-Zuordnungssymbolen zu zerlegen, der die Grundwahrheit über korrekte Anweisungen liefert.
$ ./spedi -t -f $FILE > correct.inst
Der einfachste Weg, beide Ausgaben zu vergleichen, besteht darin, Folgendes zu verwenden:
$ diff -y correct.inst speculative.inst | less
Derzeit müssen Sie main.cpp
manuell ändern, um Ergebnisse im Zusammenhang mit der Wiederherstellung von Switch-Tabellen und Anrufdiagrammen anzuzeigen.
Bei diesem Tool handelt es sich um einen akademischen Proof-of-Concept. Derzeit steht es nicht auf unserer Prioritätenliste. Es gibt jedoch bestimmte Funktionen, die wir für die Zukunft im Auge haben, nämlich:
bx
und blx
) analysiert werden. Dieses Papier enthält einige diesbezügliche Details. Kürzlich haben Andriesse et. al. haben an Nucleus
gearbeitet, einem Tool zur Funktionsidentifizierung in x64-Binärdateien. Ihr Artikel „ Compiler-Agnostic Function Detection in Binaries “ wurde auf der IEEE Euro S&P 2017 angenommen. Sie verwenden mehr oder weniger die gleichen Techniken zur Funktionsidentifizierung, die in Spedi implementiert sind. Wenn Sie an x64-Unterstützung interessiert sind, können Sie sich das Tool ansehen.
Beachten Sie jedoch, dass ihr Tool auf der Annahme basiert, dass neuere x64-Compiler Sprungtabellendaten im Abschnitt .rodata
zuordnen. Dadurch wird die Wiederherstellung von Befehlen erheblich einfacher, da sie mit linearem Sweep zuverlässig durchgeführt werden kann. Im Vergleich dazu behandelt Spedi den allgemeineren Fall von gemischtem Code/Daten durch spekulative Disassemblierung.
Dieses Projekt hängt von der Capstone-Disassemblierungsbibliothek (v3.0.4) ab.