DDISASM - это быстрый разборщик, который достаточно точен для восстановления полученного кода сборки. DDISASM реализуется с использованием языка декларативного логического программирования Datalog (Souffle) для составления правил разборки и эвристики. Disassembler сначала анализирует информацию о файле ELF/PE и декодирует суперсет возможных инструкций по созданию первоначального набора фактов Datalog. Эти факты анализируются для определения местоположения кода , символизации и границ функций . Результаты этого анализа, уточненный набор фактов Datalog, затем переводятся в промежуточное представление GTIRB для бинарного анализа и обратной инженерии. Затем можно использовать симпатичный принтер GTIRB для красивой печати GTIRB для повторной сборки кода сборки.
Бинарные форматы:
Архитектуры набора инструкций (ISA):
Вы можете запустить предварительную версию ddisasm, используя Docker:
docker pull grammatech/ddisasm:latestDDISASM можно использовать для разборки бинарного представления в представление GTIRB. Мы можем попробовать это с одним из примеров, включенных в хранилище.
Сначала запустите контейнер DDISASM Docker:
docker run -v $PWD /examples:/examples -it grammatech/ddisasm:latestВ контейнере Docker давайте построим один из примеров:
apt update && apt install gcc -y
cd /examples/ex1
gcc ex.c -o exТеперь мы можем приступить к разборке бинарного:
ddisasm ex --ir ex.gtirbПосле того, как у вас будет представление GTIRB, вы можете внести программные изменения в двоичном языке, используя GTIRB или GTIRB-rewriting.
Затем вы можете использовать GTIRB-Pprinter (включенный в изображение Docker) для создания новой версии двоичного:
gtirb-pprinter ex.gtirb -b ex_rewritten
Внутренне gtirb-pprinter генерирует файл сборки и вызовет компилятор/ассемблер (например, GCC) для создания нового двоичного файла. gtirb-pprinter будет позаботиться или генерировать все необходимые параметры командной строки, чтобы генерировать новый двоичный файл, включая параметры компиляции, библиотечные зависимости или сценарии версии.
Вы также можете использовать gtirb-pprinter для создания списка сборки для ручной модификации:
gtirb-pprinter ex.gtirb --asm ex.sЭтот список сборки может затем быть перекомпилирован вручную:
gcc -nostartfiles ex.s -o ex_rewrittenПожалуйста, посмотрите на нашу документацию для получения дополнительной информации.
См. Appling.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}
}