Spedi は、可変サイズの Thumb ISA の投機的逆アセンブラです。 ELF ファイルを入力として指定すると、Spedi は次のことができます。
Spedi は、シンボル情報を使用せずにバイナリに対して直接動作します。実験では、Spedi が IDA Pro よりも優れたパフォーマンスを発揮することがわかりました。
Spedi は、バイナリ内で使用可能なすべての基本ブロック (BB) を回復します。同じジャンプ命令を共有する BB は、1 つの最大ブロック (MB) にグループ化されます。次に、オーバーラップ分析と CFG 競合分析を使用して MB を絞り込みます。詳細については、CASES'16 の論文「バイナリ コードの投機的逆アセンブリ」を参照してください。紙はここから入手できます。
Spedi は、ベンチマーク バイナリからアセンブリ命令を平均 99.96% で (ほぼ) 完全に復元します。比較すると、IDA Pro の平均は 95.83% で、 shaベンチマークの相対的に低いパフォーマンスによって偏っています。
Spedi は平均して 97.46% の機能を正確に回復します。つまり、正しい開始アドレスと終了アドレスが識別されます。これを IDA Pro が達成した平均 40.53% と比較してください。
私たちの手法の優れた特性は、高速であり、ベンチマーク サイズの増加に合わせて適切に拡張できることです。たとえば、spedi はdu (50K 命令) を約 150 ミリ秒で逆アセンブルします。さらに最適化する余地が十分にあることに注意してください。
学術論文で Spedi を引用するには、以下を使用してください。
@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},
}
プロジェクトをビルドし、このリポジトリで利用可能なベンチマーク スイートのバイナリの 1 つで試してください。
次のコマンドは、 spedi
.text
セクションを投機的に逆アセンブルするように指示します。
$ ./spedi -t -s -f $FILE > speculative.inst
次のコマンドを使用して、正しい命令に関する正確な情報を提供する ARM コード マッピング シンボルに基づいて.text
セクションを逆アセンブルします。
$ ./spedi -t -f $FILE > correct.inst
両方の出力を比較する最も簡単な方法は、次を使用することです。
$ diff -y correct.inst speculative.inst | less
現在、スイッチ テーブルとコール グラフの回復に関連する結果を表示するには、 main.cpp
を手動で変更する必要があります。
このツールは学術的な概念実証です。現在、それは私たちの優先リストには載っていません。ただし、将来的には次のような機能を念頭に置いています。
bx
とblx
) を分析する必要があります。この文書では、関連する詳細をいくつか説明します。最近、アンドリーゼら。アル。は、x64 バイナリの関数識別ツールであるNucleus
に取り組んでいます。彼らの論文「 Compiler-Agnostic Function Detection in Binaries 」が IEEE Euro S&P 2017 で採択されました。彼らは、Spedi で実装されているのとほぼ同じ関数識別技術を使用しています。 x64 サポートに興味がある場合は、そのツールを参照してください。
ただし、彼らのツールは、最近の x64 コンパイラがジャンプ テーブル データを.rodata
セクションに割り当てるという前提に基づいていることに注意してください。これにより、線形スイープで確実に実行できるため、命令の回復が大幅に容易になります。比較すると、Spedi は、投機的逆アセンブリを使用してコードとデータが混在するより一般的なケースを処理します。
このプロジェクトは Capstone 逆アセンブリ ライブラリ (v3.0.4) に依存しています。