ddisasmは、結果のアセンブリコードが再組み立てされるのに十分な精度である高速宗教装置です。 DDISASMは、Datalog(Souffle)宣言ロジックプログラミング言語を使用して実装され、分解ルールとヒューリスティックをコンパイルします。分解者は、最初にELF/PEファイル情報を解析し、可能な指示のスーパーセットをデコードして、Datalogファクトの初期セットを作成します。これらの事実は、コードの位置、象徴化、および関数の境界を特定するために分析されます。次に、この分析の結果、洗練された一連のDatalogの事実は、バイナリ分析とリバースエンジニアリングのためのGTIRB中間表現に翻訳されます。 GTIRB Prettyプリンターを使用して、GTIRBをかなり印刷して、組み立て可能なアセンブリコードを使用できます。
バイナリ形式:
命令セットアーキテクチャ(ISAS):
Dockerを使用して、事前に作成されたバージョンのDDISASMを実行できます。
docker pull grammatech/ddisasm:latestDDISASMを使用して、GTIRB表現にバイナリを分解できます。リポジトリに含まれる例の1つで試すことができます。
まず、DDISASM Dockerコンテナを起動します。
docker run -v $PWD /examples:/examples -it grammatech/ddisasm:latestDockerコンテナ内で、例の1つを作成しましょう。
apt update && apt install gcc -y
cd /examples/ex1
gcc ex.c -o exこれで、バイナリの分解に進むことができます。
ddisasm ex --ir ex.gtirbGTIRB表現を取得したら、GTIRBまたはGTIRB-rewritingを使用してバイナリにプログラムを変更することができます。
次に、GTIRB-PPRINTER(Docker Imageに含まれる)を使用して、バイナリの新しいバージョンを作成できます。
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詳細については、ドキュメントをご覧ください。
Convributing.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}
}