Retrowriteは、X64およびAARCH64の静的バイナリライターです。ヒューリスティックなしで機能し、オーバーヘッドを導入せず、シンボル化手法(再組み立て可能なアセンブリとも呼ばれます)を使用して、ソースコードを必要とせずにバイナリに計装を挿入します。
X64バージョンとARM64バージョンは、異なる書き換えアルゴリズムを使用し、異なる機能セットをサポートしていることに注意してください。
技術的な詳細については、X64バージョンの論文( IEEE S&P'20 )とARM64バージョンのこの論文を読むことができます。
Kretrowriteは、Linuxカーネルモジュールの書き換えをサポートするX64バージョンのバリアントです。
RetrowriteはPython3(3.6)に実装されています。 pyelftoolsとcapstoneに依存します。依存関係をインストールするには、実行してください。
pip install - r requirements . txtそれらが時代遅れである可能性があるため、ディストリビューションのパッケージマネージャーから依存関係をインストールすることはお勧めしません。
| Retrowrite-X64 | retrowrite-aarch64 | |
|---|---|---|
| 剥がれたバイナリ | (WIP) | ✅ |
| 非パイバイナリ | ✅ | |
| 非標準のコンパイラ | ✅ | |
| オーバーヘッドゼロ | ✅ | ✅ |
| カーネルモジュールはサポートされています | ✅ | |
| AFLカバーの計装 | ✅ | ✅ |
| アサンの計装 | ✅ | ✅ |
| C ++サポート | (WIP) | (WIP) |
(retro) $ retrowrite --help
usage: retrowrite [-h] [-a] [-A] [-m MODULE] [-k] [--kcov] [-c] [--ignore-no-pie] [--ignore-stripped] [-v] bin outfile
positional arguments:
bin Input binary to load
outfile Symbolized ASM output
optional arguments:
-h, --help show this help message and exit
-a, --assemble Assemble instrumented assembly file into instrumented binary
-A, --asan Add binary address sanitizer instrumentation
-m MODULE, --module MODULE
Use specified instrumentation pass/module in rwtools directory
-k, --kernel Instrument a kernel module
--kcov Instrument the kernel module with kcov
-c, --cache Save/load register analysis cache (only used with --asan)
--ignore-no-pie Ignore position-independent-executable check (use with caution)
--ignore-stripped Ignore stripped executable check (use with caution)
-v, --verbose Verbose outputretrowrite -m <pass>で適用する計装パスrwtools_arm64選択しますrwtools_x64
X64の利用可能な計装パス: - アドレスサンタイザー - AFLカバレッジ情報
AARCH64の利用可能な計装パス: - アドレスサンイタイザー - AFLカバレッジ情報 + forkserver-関数エントリの粗い粒子の制御フローの整合性
retrowrite --asan </path/to/binary/> </path/to/output/binary>
注:x64で、バイナリが位置に依存しておらず、剥がされていないことを確認してください。これは、 fileコマンドを使用して確認できます(出力はELF shared objectと言ってください)。
たとえば、 /bin/lsの機器バージョンを作成します。
retrowrite --asan /bin/ls ls-basan-instrumented.s
これにより、アセンブリ( .s )ファイルが生成されます。アセンブリをバイナリに再コンパイルするために、アーキテクチャに依存します。
生成されたアセンブリは、次のようなコンパイラを使用して組み立ててリンクできます。
gcc ls-basan-instrumented.s -lasan -o ls-basan-instrumented
デバッグundefined reference to `__asan_init_v4'得られた場合に備えて、「asan_init_v4」 sed -i 's/asan_init_v4/asan_init/g' ls-basan-instrumented.sに「asan_init_v4」に置き換えます。次のコマンドは、それを行うのに役立ちます。
aarch64では、標準のコンパイラに依存して組み立ててリンクしますが、コンパイラフラグのコレクションは少し関与しているため、メインのretrowrite実行可能ファイルの-aスイッチを提供します。
retrowrite -a ls-basan-instrumented.s -lasan -o ls-basan-instrumented
AFLに記載されたバイナリを生成するには、最初に上記のように象徴されたアセンブリを生成します。次に、このようなAFL ++からafl-gccを使用して象徴されたアセンブリを再コンパイルします。
$ AFL_AS_FORCE_INSTRUMENT=1 afl-gcc foo.s -o foo
またはafl-clang 。
カバレッジ情報を備えたバイナリを機器にするには、 retrowrite -m coverage <input file> <output asm>を使用したカバレッジ計装パスを使用します。 retrowrite -a <output asm> <new binary>を使用してバイナリを再組み立てします。
これで、バイナリは次のとおりにファズすることができます。
afl-fuzz -i < seed folder > -o < out folder > < new binary >また、Retrowriteは、AFLのForkserverとして機能するための計装を追加しようとします。これが問題を引き起こす場合、 export AFL_NO_FORKSERVER=1を使用してこの動作を無効にすることができます
既存のツールによって手で変更されたり、後処理されたりする可能性のある象徴的なアセンブリを生成するには、計装パスを指定しないでください。
retrowrite </path/to/binary> <path/to/output/asm/files>
出力ASMファイルは、手または他のツールで自由に編集できます。修正後、ASMファイルは、上記のように作業バイナリに組み立てられる場合があります。
Retrowriteは他のツールと相互運用可能ですが、研究者がバイナリ計装 /変更のニーズにRetrowrite APIを使用することを強くお勧めします!これにより、バイナリまたはアセンブリファイルをロードおよび解析する必要があるという追加の努力が節約されます。
setup.shを実行:
./setup.sh kernelVirtualenvをアクティブにします(リポジトリのルートから):
source retro/bin/activate(ボーナス)retrowriteを完了したときにvirtualenvを終了するには:
deactivateretrowrite --asan --kernel </path/to/module.ko> </path/to/output/module_asan.ko>retrowrite </path/to/module.ko> <path/to/output/asm/files> ファズ化キャンペーンについては、ファジング/フォルダーを参照してください。
一般に、 librw/バイナリの読み込み、分解、および象徴のためのコードを含み、すべての変換のコアを形成します。個々の変換は、バイナリのみのアドレス消毒剤(BASAN)など、この書き換えrwtools/ワークの上に構築されていることに合格します。
kで始まるファイルとフォルダーは、カーネルリトロライトバージョンにリンクされています。
デモ/フォルダーには、ユーザースペースとカーネルリトロウライト(Demos/user_demoおよびdemos/kernel_demo)の例があります。
次の出版物は、Retrowriteプロジェクトのさまざまな部分をカバーしています。
Retrowrite:ファジングおよび消毒用のCots Cotsバイナリを静的に機器に装備します。オークランド20:IEEE International Symposium on Security and Privacy、2020
ソースはありません、問題ありません!高速バイナリファジングマッテオリッツォ、およびマティアスの支払者。 36C3'19:Chaos Communication Congress、2019年
MITライセンス
Copyright(c)2019 Hexhive Group、Sushant Dinesh [email protected]、Luca di Bartolomeo [email protected]、Antony Vennard [email protected]、Matteo Rizzo [email protected]
このソフトウェアと関連するドキュメントファイル(「ソフトウェア」)のコピーを入手して、制限なしにソフトウェアを扱うために、このソフトウェアを制限する権利を含め、ソフトウェアのコピーをコピー、変更、公開、配布、販売する、ソフトウェアのコピーを許可する人を許可する人を許可することを含めて、許可が無料で許可されます。
上記の著作権通知とこの許可通知は、ソフトウェアのすべてのコピーまたはかなりの部分に含まれるものとします。
このソフトウェアは、商品性、特定の目的への適合性、および非侵害の保証を含むがこれらに限定されない、明示的または黙示的なものを保証することなく、「現状のまま」提供されます。いかなる場合でも、著者または著作権所有者は、契約、不法行為、またはその他の訴訟、ソフトウェアまたはソフトウェアの使用またはその他の取引に関連する、またはその他の契約、またはその他の請求、またはその他の責任について責任を負いません。