Ddisasm ist ein schneller Disassembler, der genau genug ist, damit der resultierende Montagecode wieder zusammengesetzt wird. DDisasm wird mithilfe der deklarativen Logikprogrammiersprache von Datalog (Souffle) implementiert, um die Demontageregeln und Heuristiken zu erstellen. Der Disassembler analysiert zuerst ELF/PE -Dateiinformationen und dekodiert eine Übersicht über mögliche Anweisungen, um einen ersten Satz von Datalog -Fakten zu erstellen. Diese Tatsachen werden analysiert, um den Code -Ort , die Symbolisierung und die Funktionsgrenzen zu identifizieren. Die Ergebnisse dieser Analyse, ein raffinierter Satz von Datalog -Fakten, werden dann in die GTIRB -Zwischendarstellung für binäre Analyse und Reverse Engineering übersetzt. Der GTIRB Pretty -Drucker kann dann verwendet werden, um die GTIRB zum Wiederaufbaubarer -Assembler -Code zu drucken.
Binärformate:
Anleitungsset -Architekturen (ISAs):
Sie können eine vorgebaute Version von ddisasm mit Docker ausführen:
docker pull grammatech/ddisasm:latestDdisasm kann verwendet werden, um eine Binärdatei in die GTIRB -Darstellung zu zerlegen. Wir können es mit einem der im Repository enthaltenen Beispiele versuchen.
Starten Sie zunächst den Ddisasm -Docker -Container:
docker run -v $PWD /examples:/examples -it grammatech/ddisasm:latestLassen Sie uns im Docker -Container eines der Beispiele erstellen:
apt update && apt install gcc -y
cd /examples/ex1
gcc ex.c -o exJetzt können wir die Binärdatum zerlegen:
ddisasm ex --ir ex.gtirbSobald Sie die GTIRB-Darstellung haben, können Sie mithilfe von GTIRB oder GTIRB-Wrewriting programmatische Änderungen an der Binärdatum vornehmen.
Anschließend können Sie GTIRB-PPRINTER (im Docker-Bild enthalten) verwenden, um eine neue Version des Binary zu erstellen:
gtirb-pprinter ex.gtirb -b ex_rewritten
Intern wird gtirb-pprinter eine Montagedatei generiert und den Compiler/Assembler (z. B. GCC) aufgerufen, um eine neue Binärdatei zu erstellen. gtirb-pprinter wird alle erforderlichen Befehlszeilenoptionen für eine neue Binärdatei erstellt, einschließlich Kompilierungsoptionen, Bibliotheksabhängigkeiten oder Versions-Linker-Skripten.
Sie können auch gtirb-pprinter verwenden, um eine Baugruppe für manuelle Änderungen zu generieren:
gtirb-pprinter ex.gtirb --asm ex.sDiese Versammlungsliste kann dann manuell neu kompiliert werden:
gcc -nostartfiles ex.s -o ex_rewrittenBitte werfen Sie einen Blick auf unsere Dokumentation, um zusätzliche Informationen zu erhalten.
Siehe Beitrag.md
@inproceedings {flores-montoya2020,
author = {Antonio Flores-Montoya and Eric Schulte},
title = {Datalog Disassembly},
booktitle = {29th USENIX Security Symposium (USENIX Security 20)},
year = {2020},
isbn = {978-1-939133-17-5},
pages = {1075--1092},
url = {https://www.usenix.org/conference/usenixsecurity20/presentation/flores-montoya},
publisher = {USENIX Association},
month = aug,
}
@misc{schulte2020gtirb,
title={GTIRB: Intermediate Representation for Binaries},
author={Eric Schulte and Jonathan Dorn and Antonio Flores-Montoya and Aaron Ballman and Tom Johnson},
year={2020},
eprint={1907.02859},
archivePrefix={arXiv},
primaryClass={cs.PL}
}