Ddisasm est un démontrant rapide qui est suffisamment précis pour que le code d'assemblage résulte d'être réassemblé. DDisasm est implémenté à l'aide du langage de programmation logique déclaratif de la logicie-delestre (SOUFFLE) pour compiler les règles de démontage et l'heuristique. Le désassembleur analyse d'abord les informations du fichier ELF / PE et décode un superset d'instructions possibles pour créer un ensemble initial de faits de datalog. Ces faits sont analysés pour identifier l'emplacement du code , la symbolisation et les limites de la fonction . Les résultats de cette analyse, un ensemble raffiné de faits de données de données, sont ensuite traduits par la représentation intermédiaire GTIRB pour l'analyse binaire et l'ingénierie inverse. L'imprimante GTIRB Pretty peut ensuite être utilisée pour imprimer le GTIRB pour réaffirmer le code d'assemblage.
Formats binaires:
Architectures de jeu d'instructions (ISAS):
Vous pouvez exécuter une version prédéfinie de Ddisasm à l'aide de Docker:
docker pull grammatech/ddisasm:latestLe ddisasme peut être utilisé pour démonter un binaire dans la représentation GTIRB. Nous pouvons l'essayer avec l'un des exemples inclus dans le référentiel.
Tout d'abord, démarrez le conteneur DDisasm Docker:
docker run -v $PWD /examples:/examples -it grammatech/ddisasm:latestDans le conteneur Docker, construisons l'un des exemples:
apt update && apt install gcc -y
cd /examples/ex1
gcc ex.c -o exMaintenant, nous pouvons procéder à démonter le binaire:
ddisasm ex --ir ex.gtirbUne fois que vous avez la représentation GTIRB, vous pouvez apporter des modifications programmatiques au binaire en utilisant GTIRB ou GTIRB.
Ensuite, vous pouvez utiliser GTIRB-PPRINTER (inclus dans l'image Docker) pour produire une nouvelle version du binaire:
gtirb-pprinter ex.gtirb -b ex_rewritten
En interne, gtirb-pprinter générera un fichier d'assemblage et invoquera le compilateur / assembleur (par exemple GCC) pour produire un nouveau binaire. gtirb-pprinter prendra soin ou générera toutes les options de ligne de commande nécessaires pour générer un nouveau binaire, y compris les options de compilation, les dépendances de la bibliothèque ou les scripts de liaison de version.
Vous pouvez également utiliser gtirb-pprinter pour générer une liste d'assemblage pour la modification manuelle:
gtirb-pprinter ex.gtirb --asm ex.sCette liste d'assemblage peut ensuite être recompilée manuellement:
gcc -nostartfiles ex.s -o ex_rewrittenVeuillez consulter notre documentation pour plus d'informations.
Voir contribution.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}
}