
ret-sync は、デバッグセッション(WinDbg/GDB/LLDB/OllyDbg2/x64dbg)を IDA/Ghidra/Binary Ninja の逆アセンブラと同期させるプラグインのセットです。
ret-sync は Reverse-Engineering Tools SYNChronization(逆解析ツールの同期)の略です。これは、デバッグセッション(WinDbg/GDB/LLDB/OllyDbg/OllyDbg2/x64dbg)と逆アセンブラ(IDA/Ghidra/Binary Ninja)を同期するためのプラグイン群です。基本的な考え方は単純です:静的解析と動的解析の両方の長所を活かすことです。
デバッガと動的解析は、以下を提供します:
!peb、!drvobj、!addressなど)逆アセンブラと静的解析は、以下を提供します:
主な機能:
ret-sync は、私が Quarkslab 在籍中に開発・保守した qb-sync のフォークです。
デバッガプラグイン:
ext_windbg/sync: WinDbg拡張のソースファイル、ビルド後: sync.dllext_gdb/sync.py: GDBプラグインext_lldb/sync.py: LLDBプラグインext_olly1: OllyDbg 1.10 プラグインext_olly2: OllyDbg v2 プラグインext_x64dbg: x64dbg プラグイン逆アセンブラプラグイン:
ext_ida/SyncPlugin.pyext_ghidra/dist/ghidra_*_retsync.zip: Ghidra プラグインext_bn/retsync: Binary Ninja プラグインそしてライブラリプラグイン:
ext_lib/sync.py: スタンドアロン Python ライブラリIDA および GDB プラグインには有効な Python 環境が必要です。Python 2 (>=2.7) および Python 3 に対応しています。
WinDbg/OllyDbg/OllyDbg2/x64dbg デバッガ用のプリビルドバイナリは、Azure DevOps パイプラインを通じて提供されています:
最新のビルドを選択し、Related セクションの成果物「6 published」を確認してください。

Ghidra プラグインのプリビルドプラグインアーカイブは ext_ghidra/dist に含まれています。
ret-sync は、通常のセットアップ(デバッガと逆アセンブラが同一ホスト上にあり、モジュール名が一致する場合)では、ほとんどのユーザーにとってそのまま動作するはずです。
ただし、特定のシナリオでは個別の設定が必要になる場合があります。そのため、拡張機能とプラグインは、ユーザーのホームディレクトリにあるオプションのグローバル設定ファイル .sync を確認します。これは有効な .INI ファイルである必要があります。
さらに、IDA および Ghidra プラグインは、最初に IDB ディレクトリまたはプロジェクトディレクトリ(<project>.rep)内の設定ファイルを探し、IDB/プロジェクトごとのローカル設定を可能にします。ローカル設定ファイルが存在する場合、グローバル設定ファイルは無視されます。
これらの設定ファイルで宣言された値はデフォルト値を上書きします。デフォルトでは .sync ファイルは作成されないことに注意してください。
以下に、設定ファイルが有用/必要となる3つの一般的なシナリオを詳しく説明します:
[INTERFACE] セクションは、ネットワーク関連の設定をカスタマイズするために使用します。例えば、IDA を仮想マシン(または別のホスト)内で動作するデバッガと同期させたい場合(一般的なリモートカーネルデバッグシナリオ)を考えます。
単純に2つの .sync ファイルを作成します:
これは **ret-sync** ``IDA`` プラグインに対し、インターフェース ``192.168.128.1`` のポート ``9234`` で待ち受けるよう指示します。言うまでもなく、このインターフェースはリモートホストまたは仮想マシンから到達可能でなければなりません。
* デバッガが実行されているマシン上のユーザーのホームディレクトリ内のもの:```
[INTERFACE]
host=192.168.128.1
port=9234
これは、ret-sync デバッガプラグインに、以前にこのインターフェースでリッスンするように設定された ret-sync IDA プラグインに接続するよう指示します。
注: ここでは実際のIPアドレスを指定する必要があり、0.0.0.0 を使用しないでください。これは、この変数がバインドと接続の両方で複数のソースによって使用されるため、0.0.0.0 を使用すると奇妙なエラーが発生するためです。
[ALIASES] ntoskrnl_vuln.exe=ntkrnlmp.exe
``[ALIASES]``セクションは、ディスアセンブラ(IDA/Ghidra)がモジュールをそのディスパッチャ/プログラムマネージャに登録するために使用する名前をカスタマイズするために使用されます。
デフォルトでは、ディスアセンブラプラグインは入力ファイルの名前を使用します。しかし、事前にファイル名を変更した場合、デバッガから見える実際のプロセスまたはロードされたモジュールの名前と一致しなくなることがあります。
ここでは、ディスパッチャに`ntkrnlmp.exe`(実際の名前)を`ntoskrnl_vuln.exe`(IDB名)の代わりに一致させるように指示するだけです。
## gdbとQt Creatorデバッグフロントエンド
Qt Creatorデバッグフロントエンドは、gdbコマンド出力のログ記録方法を変更します。これにより同期が妨げられるため、一時ファイルの代わりに同期に生のgdb出力を使用するオプションがあります。.sync設定ファイルでは、次のように指定します。```
[GENERAL]
use_tmp_logging_file=false
ターゲットに対してQtデバッグフロントエンドを使用する場合。
/proc/<pid>/mapsシリアル経由での組み込みデバイスのデバッグや、QEMU内の生ファームウェアのデバッグなど、特定のシナリオでは、gdbはPIDを認識できず、/proc/<pid>/maps にアクセスできません。
このような場合、[INIT] セクションを使用してプラグインにカスタムコンテキストを渡します。これにより、PIDやメモリマッピングなどの一部のフィールドを上書きできます。
.sync コンテンツ抽出:```
[INIT]
context = {
"pid": 200,
"mappings": [ [0x400000, 0x7A81158, 0x7681158, "asav941-200.qcow2|lina"] ]
}
各マッピングのエントリは `mem_base`、`mem_end`、`mem_size`、`mem_name` です。
## 自動アドレスリベースのバイパス
組み込みデバイスのデバッグやミニマルなデバッグインターフェースへの接続など、一部のシナリオでは、ディスアセンブラプラグインに実装されている自動アドレスリベース機能をバイパスする方が便利な場合があります。
`use_raw_addr` オプションは現在、Ghidra でのみサポートされています。
.sync 設定ファイルで次のように使用します。```
[GENERAL]
use_raw_addr=true
IDA 9.2以上が必要です。古いバージョンでは、利用可能なTagsからida9.2タグより前のプロジェクトをチェックアウトしてください。
IDAのインストールでは、ext_idaからSyncplugin.pyとretsyncフォルダをIDAプラグインディレクトリにコピーします。例:
C:\Program Files\IDA Pro 7.4\plugins%APPDATA%\Hex-Rays\IDA Pro\plugins~/.idapro/pluginsAlt-Shift-S)またはEdit -> Plugins -> ``ret-sync`````
[sync] default idb name: ld.exe
[sync] sync enabled
[sync] cmdline: "C:\Program Files\Python38\python.exe" -u "C:\Users\user\AppData\Roaming\Hex-Rays\IDA Pro\plugins\retsync\broker.py" --idb "target.exe"
[sync] module base 0x100400000
[sync] hexrays #7.3.0.190614 found
[sync] broker started
[sync] plugin loaded
[sync] << broker << dispatcher not found, trying to run it
[sync] << broker << dispatcher now runs with pid: 6544
[sync] << broker << connected to dispatcher
[sync] << broker << listening on port 63107### IDAプラグインのトラブルシューティング
To troubleshoot issues with the IDA extension two options are available in the
file `retsync/rsconfig.py`:```
LOG_LEVEL = logging.INFO
LOG_TO_FILE_ENABLE = False
LOG_LEVEL の値を logging.DEBUG に設定すると、プラグインの出力がより詳細になります。
LOG_TO_FILE_ENABLE の値を True に設定すると、broker.py および dispatcher.py の例外情報が専用ファイルにログ出力されるようになります。ログファイルは %TMP% フォルダに生成され、ファイル名は retsync.%s.err . のパターンになります。
ext_ghidra/dist フォルダにあるビルド済みバージョンを使用するか、指示に従ってビルドしてください。各拡張のビルドは、プラグインのファイル名で指定された Ghidra のバージョンのみをサポートします。例:ghidra_9.1_PUBLIC_20191104_retsync.zip は Ghidra 9.1 Public 用です。
3. あなたのGhidraインストール用の拡張機能をビルドします (`$GHIDRA_DIR` をあなたのインストールディレクトリに置き換えてください)```bash
cd ext_ghidra
gradle -PGHIDRA_INSTALL_DIR=$GHIDRA_DIR