Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
ret-sync — ret-sync は、デバッグセッション(WinDbg/GDB/LLDB/OllyDbg2/x64dbg)を IDA/Ghidra/Binary Ninja の逆アセンブラと同期させるプラグインのセットです。 | Kitploit
ツール/GitHubGitHub/bootleg/ret-sync
動的分析 (サンドボックス)リバースエンジニアリングデバッガユーティリティとフレームワークバイナリ解析
GitHubbootleg/ret-sync

ret-sync

ret-sync は、デバッグセッション(WinDbg/GDB/LLDB/OllyDbg2/x64dbg)を IDA/Ghidra/Binary Ninja の逆アセンブラと同期させるプラグインのセットです。

リポジトリを見る
2.4k3076ヶ月前Kitploit レビュー済み

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有

ret-sync

ret-sync は Reverse-Engineering Tools SYNChronization(逆解析ツールの同期)の略です。これは、デバッグセッション(WinDbg/GDB/LLDB/OllyDbg/OllyDbg2/x64dbg)と逆アセンブラ(IDA/Ghidra/Binary Ninja)を同期するためのプラグイン群です。基本的な考え方は単純です:静的解析と動的解析の両方の長所を活かすことです。

デバッガと動的解析は、以下を提供します:

  • ライブの動的コンテキスト(レジスタ、メモリなど)によるローカルビュー
  • 組み込みの特殊機能/API(例:WinDbgの!peb、!drvobj、!addressなど)

逆アセンブラと静的解析は、以下を提供します:

  • モジュール全体のマクロビュー
  • コード解析、シグネチャ、型など
  • 凝ったグラフビュー
  • 逆コンパイル
  • IDB/GPR内での知識の永続的保存

主な機能:

  • グラフおよび逆コンパイルビューをデバッガの状態と同期
  • ASLRに対応する必要なし、アドレスは動的にリベース
  • デバッガから逆アセンブラへデータ(コメント、コマンド出力)を渡す
  • 複数のIDB/GPRを同時に同期可能で、複数のモジュールを容易にトレース可能
  • 逆アセンブラとデバッガを異なるホスト/VMで実行可能

ret-sync は、私が Quarkslab 在籍中に開発・保守した qb-sync のフォークです。


目次

  • リポジトリの内容
  • 一般的な前提条件
  • バイナリリリース
  • ret-sync の設定
  • インストール
    • IDA 拡張
    • Ghidra 拡張
    • Binary Ninja 拡張
    • WinDbg 拡張
    • GNU gdb (GDB) インストール
    • LLDB インストール
    • OllyDbg 1.10 インストール
    • OllyDbg2 インストール
    • x64dbg インストール
  • 使用方法
    • ret-sync デバッガコマンド
    • IDA の使用方法
    • Ghidra の使用方法
    • Binary Ninja の使用方法
    • WinDbg の使用方法
    • GNU gdb (GDB) の使用方法
    • LLDB の使用方法
    • OllyDbg 1.10 の使用方法
    • OllyDbg2 の使用方法
    • x64dbg の使用方法
    • Python ライブラリの使用方法
  • 拡張
  • TODO
  • 既知のバグ/制限事項
  • ライセンス
  • 謝辞

リポジトリの内容

デバッガプラグイン:

  • ext_windbg/sync: WinDbg拡張のソースファイル、ビルド後: sync.dll
  • ext_gdb/sync.py: GDBプラグイン
  • ext_lldb/sync.py: LLDBプラグイン
  • ext_olly1: OllyDbg 1.10 プラグイン
  • ext_olly2: OllyDbg v2 プラグイン
  • ext_x64dbg: x64dbg プラグイン

逆アセンブラプラグイン:

  • ext_ida/SyncPlugin.py
  • ext_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 パイプラインを通じて提供されています:Build Status

最新のビルドを選択し、Related セクションの成果物「6 published」を確認してください。

Ghidra プラグインのプリビルドプラグインアーカイブは ext_ghidra/dist に含まれています。

ret-sync の設定

ret-sync は、通常のセットアップ(デバッガと逆アセンブラが同一ホスト上にあり、モジュール名が一致する場合)では、ほとんどのユーザーにとってそのまま動作するはずです。

ただし、特定のシナリオでは個別の設定が必要になる場合があります。そのため、拡張機能とプラグインは、ユーザーのホームディレクトリにあるオプションのグローバル設定ファイル .sync を確認します。これは有効な .INI ファイルである必要があります。

さらに、IDA および Ghidra プラグインは、最初に IDB ディレクトリまたはプロジェクトディレクトリ(<project>.rep)内の設定ファイルを探し、IDB/プロジェクトごとのローカル設定を可能にします。ローカル設定ファイルが存在する場合、グローバル設定ファイルは無視されます。

これらの設定ファイルで宣言された値はデフォルト値を上書きします。デフォルトでは .sync ファイルは作成されないことに注意してください。

以下に、設定ファイルが有用/必要となる3つの一般的なシナリオを詳しく説明します:

  • リモートデバッグ
  • モジュール名の不一致
  • PID の欠落

リモートデバッグ:デバッガと逆アセンブラが異なるホスト上にある場合

[INTERFACE] セクションは、ネットワーク関連の設定をカスタマイズするために使用します。例えば、IDA を仮想マシン(または別のホスト)内で動作するデバッガと同期させたい場合(一般的なリモートカーネルデバッグシナリオ)を考えます。

単純に2つの .sync ファイルを作成します:

  • IDA がインストールされているマシンでは、IDB ディレクトリに配置します
  • Ghidra の場合は、ホームディレクトリに配置します(例: "/home/user" または "C:\Users\user")。``` [INTERFACE] host=192.168.128.1 port=9234
root@kitploit:~
これは **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 を使用すると奇妙なエラーが発生するためです。

IDBとデバッガモジュールの名前が異なる```

[ALIASES] ntoskrnl_vuln.exe=ntkrnlmp.exe

root@kitploit:~
``[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"] ] }

root@kitploit:~
各マッピングのエントリは `mem_base`、`mem_end`、`mem_size`、`mem_name` です。

## 自動アドレスリベースのバイパス

組み込みデバイスのデバッグやミニマルなデバッグインターフェースへの接続など、一部のシナリオでは、ディスアセンブラプラグインに実装されている自動アドレスリベース機能をバイパスする方が便利な場合があります。

`use_raw_addr` オプションは現在、Ghidra でのみサポートされています。
.sync 設定ファイルで次のように使用します。```
[GENERAL]
use_raw_addr=true

インストール

IDA拡張機能

IDAの前提条件

IDA 9.2以上が必要です。古いバージョンでは、利用可能なTagsからida9.2タグより前のプロジェクトをチェックアウトしてください。

IDA拡張機能のインストール

IDAのインストールでは、ext_idaからSyncplugin.pyとretsyncフォルダをIDAプラグインディレクトリにコピーします。例:

  • C:\Program Files\IDA Pro 7.4\plugins
  • %APPDATA%\Hex-Rays\IDA Pro\plugins
  • ~/.idapro/plugins

IDA拡張機能の実行

  1. IDBを開く
  2. IDAでプラグインを実行します(Alt-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
root@kitploit:~
### 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 . のパターンになります。

Ghidra 拡張

Ghidra 拡張のビルド

ext_ghidra/dist フォルダにあるビルド済みバージョンを使用するか、指示に従ってビルドしてください。各拡張のビルドは、プラグインのファイル名で指定された Ghidra のバージョンのみをサポートします。例:ghidra_9.1_PUBLIC_20191104_retsync.zip は Ghidra 9.1 Public 用です。

  1. Ghidra をインストール
  2. Gradle をインストール```bash apt install gradle
root@kitploit:~
3. あなたのGhidraインストール用の拡張機能をビルドします (`$GHIDRA_DIR` をあなたのインストールディレクトリに置き換えてください)```bash
cd ext_ghidra
gradle -PGHIDRA_INSTALL_DIR=$GHIDRA_DIR

Ghidra拡張機能のインストール

  1. Ghidraプロジェクトマネージャから: File -> Install Extensions... を選択し、+ 記号をクリックして ext_ghidra/dist/ghidra_*_retsync.zip を選択し、OKをクリックします。 これにより、zipファイルから retsync フォルダが $GHIDRA_DIR/Extensions/Ghidra/ に展開されます。
  2. 指示に従いGhidraを再起動します。
  3. Ghidraを再読み込み後、CodeBrowserでモジュールを開きます。新しい拡張機能プラグインが検出されたというメッセージが表示されるはずです。設定のために「はい」を選択します。その後、「RetSyncPlugin」にチェックを入れ、OKをクリックします。コンソールに次のような表示がされるはずです:``` [*] retsync init [>] programOpened: tm.sys imageBase: 0x1c0000000
root@kitploit:~
4. Ghidra CodeBrowser ツールから: ツールバーのアイコンまたはショートカットを使用して、同期を有効 (``Alt+s``)/無効 (``Alt+Shift+s``)/再開 (``Alt+r``) にします。

ステータスウィンドウは ``Windows`` -> ``RetSyncPlugin`` からも利用できます。通常はそれを側面にドロップして、Ghidra 環境のウィンドウと統合することをお勧めします。

## Binary Ninja 拡張機能

Binary Ninja のサポートは実験的です。分析データベースのバックアップを必ず行ってください。

### Binary Ninja の前提条件

**ret-sync** には、Binary Ninja バージョン 2.2 以上と Python 3 が必要です (Python 2 はサポートされていません)。

### Binary Ninja 拡張機能のインストール

**ret-sync** はまだ Binary Ninja のプラグインマネージャーを通じて配布されていません。手動インストールが必要です。単に `ext_bn` フォルダの内容を Binary Ninja のプラグインフォルダにコピーしてください。例:

`%APPDATA%\Binary Ninja\plugins`

Binary Ninja を再起動した後、コンソールウィンドウに以下の出力が表示されるはずです。```
[sync] commands added
Loaded python3 plugin 'retsync'

WinDbg 拡張

WinDbg 拡張のビルド

ext_windbg に含まれる Visual Studio 2017 ソリューションを使用します。Visual Studio Community Edition 2017 と 2026 が正常にテストされました(間のバージョンでも動作するはずです)。

これにより x64\release\sync.dll ファイルがビルドされます。

WinDbg 拡張のインストール

生成された sync.dll ファイルを適切な Windbg 拡張パスにコピーする必要があります。

  • WinDbg Classic:

古いバージョンの Windbg では、次のようになります(x86/x64 の種類に注意してください)。例:

C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\winext\sync.dll

  • Windbg Preview

拡張を保存するフォルダは PATH に基づいているようなので、クエリされる場所のいずれかに配置する必要があります。

一例として、次の場所に配置します:

C:\Users\user\AppData\Local\Microsoft\WindowsApps\sync.dll

WinDbg 拡張の実行

  1. ターゲットで WinDbg を起動します。
  2. 拡張をロードします(.load コマンド)。``` 0:000> .load sync [sync.dll] DebugExtensionInitialize, ExtensionApis loaded
root@kitploit:~
3. WinDbg を同期```
      0:000> !sync
      [sync] No argument found, using default host (127.0.0.1:9100)
      [sync] sync success, sock 0x5a8
      [sync] probing sync
      [sync] sync is now enabled with host 127.0.0.1

例:IDAの出力ウィンドウ内で``` [] << broker << dispatcher msg: add new client (listening on port 63898), nb client(s): 1 [] << broker << dispatcher msg: new debugger client: dbg connect - HostMachine\HostUser [sync] set debugger dialect to windbg, enabling hotkeys

root@kitploit:~
Windbgの現在のモジュールがIDAのファイル名と一致する場合```
      [sync] idb is enabled with the idb client matching the module name.

WinDbgのインストールトラブルシューティング

注意: 次のエラーが表示された場合、上記の手順でファイルを正しいフォルダにコピーしていないことが原因です。``` 0: kd> .load sync The call to LoadLibrary(sync) failed, Win32 error 0n2 "The system cannot find the file specified." Please check your debugger configuration and/or network access.

root@kitploit:~
以下のエラーは通常、Windbgが拡張機能の間違ったフレーバーを読み込もうとしたことを意味します。例: ``x64`` の代わりに ``x86`` の `sync.dll`。```
0:000> .load sync
The call to LoadLibrary(sync) failed, Win32 error 0n193
    "%1 is not a valid Win32 application."
Please check your debugger configuration and/or network access.

As WinDbg Preview は同じディレクトリから両方のプラグイン(x86 と x64)を読み込むため、x86 ファイル sync32.dll の名前を変更することができます。``` 0:000> .load sync32

root@kitploit:~
## GNU gdb (GDB) のインストール

1. `ext_gdb/sync.py` を任意のディレクトリにコピーします
2. 拡張機能をロードします(auto-load-scripts を参照)```
    gdb> source sync.py
    [sync] configuration file loaded 192.168.52.1:9100
    [sync] commands added

LLDBのインストール

LLDBのサポートは実験的ですが、次の手順を実行してください:

  1. 拡張機能をロードします(~/.lldbinit に追加することもできます)``` lldb> command script import sync
root@kitploit:~
## OllyDbg 1.10 インストール

OllyDbg 1.10 のサポートは試験的ですが、以下の手順に従います。

1. VS ソリューションを使ってプラグインをビルドします(オプション、プリビルドバイナリを参照)
2. その dll を OllyDbg のプラグインディレクトリにコピーします

## OllyDbg2 インストール

OllyDbg2 のサポートは試験的ですが、以下の手順に従います。

1. VS ソリューションを使ってプラグインをビルドします(オプション、プリビルドバイナリを参照)
2. その dll を OllyDbg2 のプラグインディレクトリにコピーします

## x64dbg インストール

testplugin (https://github.com/x64dbg/testplugin) に基づいています。x64dbg のサポートは試験的ですが、以下の手順に従います。

1. VS ソリューションを使ってプラグインをビルドします(オプション、プリビルドバイナリを参照)。
   プラグイン SDK の異なるバージョンが必要になる場合があります。
   そのコピーは x64dbg の各リリースに含まれています。
   "`pluginsdk`" ディレクトリを "`ext_x64dbg\x64dbg_sync`" に貼り付けてください。
2. その dll(拡張子は `.d32` または `.dp64`)を x64dbg のプラグインディレクトリにコピーします。

# 使用法

## **ret-sync** デバッガーコマンド

コマンドライン指向のデバッガー(主に Windbg と GDB)では、リバースエンジニアリングタスクを支援するために一連のコマンドが **ret-sync** によって公開されています。

以下のコマンドは汎用的です(Windbg と GDB)。WinDbg では `!` プレフィックスが必要なことに注意してください(例:GDB では `sync`、WinDbg では `!sync`)。

| デバッガーコマンド           | 説明                                                                               |
|----------------------------|-------------------------------------------------------------------------------------------|
| `synchelp`                   | 利用可能なコマンドのリストを簡単な説明付きで表示します                             |
| `sync`                       | 同期を開始します                                                                     |
| `syncoff`                    | 同期を停止します                                                                      |
| `cmt [-a address] <string>`  | 逆アセンブラ内の現在の IP にコメントを追加します                                               |
| `rcmt [-a address]`          | 逆アセンブラ内の現在の IP のコメントをリセットします                                               |
| `fcmt [-a address] <string>` | 現在の IP が位置する関数に関数コメントを追加します                        |
| `raddr <expression>`         | 式から評価された再ベースアドレスをコメントとして追加します                              |
| `rln <expression>`           | 逆アセンブラから指定されたアドレスのシンボルを取得します                                    |
| `lbl [-a address] <string>`  | 逆アセンブラ内の現在の IP にラベル名を追加します                                            |
| `cmd <string>`               | デバッガーでコマンドを実行し、その出力を逆アセンブラ内の現在の IP にコメントとして追加します |
| `bc <\|\|on\|off\|set 0xBBGGRR>` | 逆アセンブラでのパスカラーリングを有効/無効にします                                              |
| `idblist`                    | ディスパッチャーに接続されているすべての IDB クライアントのリストを取得します                                   |
| `syncmodauto <on\|off>`       | モジュール名に基づく逆アセンブラの自動切り替えを有効/無効にします                              |
| `idbn <n>`                   | アクティブな IDB を n 番目のクライアントに設定します                                                         |
| `jmpto <expression>`         |                                                                                           |
| `jmpraw <expression>` | IDB が有効な場合、逆アセンブラのビューが結果のアドレスと同期されます。    |
| `translate <base> <addr> <mod>` | アドレスをモジュール名とオフセットに関して再ベースします   |


WinDbg 固有のコマンド:

| デバッガーコマンド           | 説明                                                                               |
|----------------------------|-------------------------------------------------------------------------------------------|
| `curmod`  |  現在の命令オフセットのモジュール情報を表示します(トラブルシューティング用) |
| `modlist`  |  デバッガーマークアップ言語 (DML) 強化版モジュールリスト。アクティブな IDB の切り替えをスムーズに行います  |
| `idb <モジュール名>`  |  指定されたモジュールをアクティブな IDB に設定します (`modlist` の強化版 `lm` を参照) |
| `modmap <base> <size> <name>` |  合成(「偽の」)モジュール(ベースアドレスとサイズで定義)をデバッガーの内部リストに追加します  |
| `modunmap <base>` |  指定したベースアドレスの合成モジュールマッピングを削除します  |
| `modcheck <\|\|md5>`  |  現在のモジュールが本当に IDB のファイルと一致しているか確認するために使用します(例:モジュールが更新された場合)  |
| `bpcmds <\|\|save\|load\|>` | **bpcmds** ラッパー。**.bpcmds**(ブレークポイントコマンドリスト)出力を現在の IDB に保存/再読み込みします  |
| `ks` | デバッガーマークアップ言語 (DML) 強化版 **kv** コマンドの出力   |


GDB 固有のコマンド:

| デバッガーコマンド           | 説明                                                                               |
|----------------------------|-------------------------------------------------------------------------------------------|
|`bbt` |  美しいバックトレース。GDB の **bt** と似ていますが、逆アセンブラからシンボルを要求します  |
| `patch`  | ライブコンテキストに基づいて逆アセンブラ内のバイトをパッチします   |
| `bx` | シンボルを使用する GDB の **x** と似ています。シンボルは逆アセンブラによって解決されます   |
| `cc` | 逆アセンブラのカーソルまで継続します  |


## IDA の使用法

### IDA プラグインの GUI

``Overwrite idb name`` 入力フィールドは、デフォルトの IDB 名を変更するためのものです。これは、プラグインがディスパッチャーに登録するために使用する名前です。IDB の自動切り替えはモジュール名の一致に基づいています。名前の競合(``foo.exe`` と ``foo.dll`` など)がある場合、これをマッチングを容易にするために使用できます。注意:同期がアクティブな状態で入力フィールドを変更した場合は、ディスパッチャーに再登録する必要があります。これは "``Restart``" ボタンを使用するだけで行えます。

念のため、``.sync`` 設定ファイルを使用してデフォルトでエイリアスを設定することも可能です。



### IDA のグローバルショートカット

**ret-sync** は IDA 内で以下のグローバルショートカットを定義しています。

* ``Alt-Shift-S``  - **ret-sync** プラグインを実行
* ``Ctrl-Shift-S``  - グローバル同期を切り替え
* ``Ctrl-H``  - Hex-Rays 同期を切り替え

デバッグツールバーにも、グローバルおよび Hex-Rays 同期を切り替えるための 2 つのボタンがあります。

### IDA のデバッガーコマンドへのバインド

``Syncplugin.py`` は、デバッガーコマンドラッパーのホットキーも登録します。

* ``F2`` - カーソルアドレスにブレークポイントを設定
* ``F3`` - カーソルアドレスにワンショットブレークポイントを設定
* ``Ctrl-F2`` - カーソルアドレスにハードウェアブレークポイントを設定
* ``Ctrl-F3`` - カーソルアドレスにワンショットハードウェアブレークポイントを設定
* ``Alt-F2`` - 現在のカーソルアドレスを変換(デバッガーで再ベース)
* ``Alt-F5`` - Go
* ``Ctrl-Alt-F5`` - 実行(GDB のみ)
* ``F10`` - シングルステップ
* ``F11`` - シングルトレース

これらのコマンドは、現在の IDB がアクティブな場合のみ利用可能です。可能な場合、他のデバッガーにも実装されています。

## Ghidra の使用法

### Ghidra プラグインの GUI

RetSyncPlugin を開いたら、単純にドラッグ&ドロップで CodeBrowser ウィンドウに追加できます。

![](https://assets.kitploit.com/production/public/readmes/3693/c6d122e27a256e4f99d0f760d2d6febb89648881dbdee9d6ffd84092bb0d9931.png)

複数のモジュールを表示したい場合は、ファイルを同じ CodeBrowser ビューアで開く必要があります。単純に追加のファイルを CodeBrowser ウィンドウにドラッグ&ドロップすると、上記のような結果になります。

### Ghidra のグローバルショートカット

**ret-sync** は Ghidra 内で以下のグローバルショートカットを定義しています。

* ``Alt-S``  - 同期を有効化
* ``Alt-Shift-S``  - 同期を無効化
* ``Alt-R``  - 同期を再起動
* ``Alt-Shift-R``  - 設定を再読み込み

### Ghidra のデバッガーコマンドへのバインド

デバッガーコマンドへのバインドも実装されています。これらは IDA 拡張のものと似ています("Go" コマンドを除く)。

* ``F2``  - カーソルアドレスにブレークポイントを設定
* ``Ctrl-F2`` - カーソルアドレスにハードウェアブレークポイントを設定
* ``Alt-F3`` - カーソルアドレスにワンショットブレークポイントを設定
* ``Ctrl-F3`` - カーソルアドレスにワンショットハードウェアブレークポイントを設定
* ``Alt-F2`` - 現在のカーソルアドレスを変換(デバッガーで再ベース)
* ``F5`` - Go
* ``Alt-F5`` - 実行(GDB のみ)
* ``F10`` - シングルステップ
* ``F11`` - シングルトレース


## Binary Ninja の使用法

### Binary Ninja のグローバルショートカット

**ret-sync** は Binary Ninja 内で以下のグローバルショートカットを定義しています。

* ``Alt-S``  - 同期を有効化
* ``Alt-Shift-S``  - 同期を無効化


### Binary Ninja のショートカット

デバッガーコマンドへのバインドも実装されています。これらは IDA 拡張のものと似ています。

* ``F2``  - カーソルアドレスにブレークポイントを設定
* ``Ctrl-F2`` - カーソルアドレスにハードウェアブレークポイントを設定
* ``Alt-F3`` - カーソルアドレスにワンショットブレークポイントを設定
* ``Ctrl-F3`` - カーソルアドレスにワンショットハードウェアブレークポイントを設定
* ``Alt-F2`` - 現在のカーソルアドレスを変換(デバッガーで再ベース)
* ``Alt-F5`` - Go
* ``F10`` - シングルステップ
* ``F11`` - シングルトレース


## WinDbg の使用法

### WinDbg プラグインコマンド

* **!sync**: 同期を開始
* **!syncoff**: 同期を停止
* **!synchelp**: 利用可能なコマンドのリストを簡単な説明付きで表示
* **!cmt [-a address] <string>**: IDA 内の現在の IP にコメントを追加```
    [WinDbg]
    0:000:x86> pr
    eax=00000032 ebx=00000032 ecx=00000032 edx=0028eebc esi=00000032 edi=00000064
    eip=00430db1 esp=0028ed94 ebp=00000000 iopl=0         nv up ei pl nz na po nc
    cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00000202
    image00000000_00400000+0x30db1:
    00430db1 57    push    edi

    0:000:x86> dd esp 8
    0028ed94  00000000 00433845 0028eebc 00000032
    0028eda4  0028f88c 00000064 002b049e 00000110

    0:000:x86> !cmt 0028ed94  00000000 00433845 0028eebc 00000032
    [sync.dll]  !cmt called

    [IDA]
    .text:00430DB1    push    edi             ; 0028ed94  00000000 00433845 0028eebc 00000032
  • !rcmt [-a address]: 現在のIPのコメントをリセット``` [WinDbg] 0:000:x86> !rcmt [sync] !rcmt called

    [IDA] .text:00430DB1 push edi

root@kitploit:~
* **!fcmt [-a address] <string>**: 現在のIPが位置する関数に関数コメントを追加する```
    [WinDbg]
    0:000:x86> !fcmt decodes buffer with key
    [sync] !fcmt called

    [IDA]
    .text:004012E0 ; decodes buffer with key
    .text:004012E0                 public decrypt_func
    .text:004012E0 decrypt_func    proc near
    .text:004012E0                 push    ebp

注:このコマンドを引数なしで呼び出すと、関数のコメントがリセットされます。

  • !raddr : 式から評価された再ベース済みアドレスでコメントを追加します

  • !rln : 指定されたアドレスの逆アセンブラからシンボルを取得します

  • !lbl [-a address] : 逆アセンブラの現在のIPにラベル名を追加します``` [WinDbg] 0:000:x86> !lbl meaningful_label [sync] !lbl called

    [IDA] .text:000000000040271E meaningful_label: .text:000000000040271E mov rdx, rsp

root@kitploit:~
* **!cmd <string>**: WinDbgでコマンドを実行し、その出力を逆アセンブラの現在のIPにコメントとして追加します。```
    [WinDbg]
    0:000:x86> pr
    eax=00000032 ebx=00000032 ecx=00000032 edx=0028eebc esi=00000032 edi=00000064
    eip=00430db1 esp=0028ed94 ebp=00000000 iopl=0         nv up ei pl nz na po nc
    cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00000202
    image00000000_00400000+0x30db1:
    00430db1 57     push    edi
    [sync.dll]  !cmd r edi

    [IDA]
    .text:00430DB1    push    edi             ; edi=00000064
  • !bc <||on|off|set 0xBBGGRR> : 逆アセンブラでのパス色付けを有効/無効にします。 これはコードトレーシングツールではありません。 そのための効率的なツールがあります。手動でステップ実行した各命令が グラフ内で色付けされます。引数なしで呼び出された場合、現在のIPにある単一の命令に色を付けます。 "set" 引数は、新しい16進RGBコード(0xFFFFFFより大きい値で呼び出された場合は色をリセット)でパス色を設定するために使用されます。
  • !idblist: ディスパッチャに接続されているすべてのIDBクライアントのリストを取得します:``` [WinDbg] 0:000> !idblist

    currently connected idb(s): [0] target.exe

root@kitploit:~
* **!syncmodauto <on|off>**: 逆アセンブラの自動切り替えをモジュール名に基づいて有効/無効にします:```
    [WinDbg]
    0:000> !syncmodauto off

    [IDA]
    [*] << broker << dispatcher msg: sync mode auto set to off
  • !idbn : アクティブIDBをn番目のクライアントに設定します。nは有効な10進数でなければなりません。 これは半自動モードです(偉大なjjへの個人的な賛辞)``` [WinDbg] 0:000:> !idbn 0

    current idb set to 0

root@kitploit:~
この例では、現在アクティブなIDBクライアントは次のように設定されていました:```
	[0] target.exe.
  • !jmpto : 引数として与えられた式は、現在のデバッガのステータスのコンテキストで評価されます。 その後、一致するモジュールが登録されている場合、逆アセンブラのビューが結果のアドレスと同期されます。 手動同期と見なすことができ、リロケーションは自動的に即座に実行されます。 特にランダムにリロケーションされるバイナリに有用です。
  • !jmpraw : 引数として与えられた式は、現在のデバッガのステータスのコンテキストで評価されます。 IDBが有効な場合、逆アセンブラのビューが結果のアドレスと同期されます。アドレスはリベースされず、 IDBの切り替えも行われません。 特に動的に割り当てられた/生成されたコードに有用です。
  • !modmap : 合成(「偽の」)モジュール(ベースアドレスとサイズで定義)がデバッガの内部リストに追加されます。 MSDNより: "すべてのモジュールがリロードされた場合(例えば、ReloadをModuleパラメータを空文字列にして呼び出すなど)、すべての合成モジュールは破棄されます。" 動的に割り当てられた/生成されたコードをより簡単にデバッグするために使用できます。
  • !modunmap : ベースアドレスにある以前にマッピングされた合成モジュールを削除します。
  • !modcheck <||md5>: 現在のモジュールが実際にIDBのファイルと一致するか(例:モジュールが更新された)を確認するために使用します。 引数なしで呼び出された場合、デバッグディレクトリからのPDBのGUIDが使用されます。代わりにmd5を使用することもできますが、 ローカルデバッグ対象(リモートカーネルデバッグでは不可)の場合のみです。
  • !bpcmds <||save|load|>: bpcmdsラッパー。.bpcmds(ブレークポイントコマンドリスト)の出力を現在のIDBに保存および再読み込みします。 引数なしで呼び出された場合、保存されたデータを表示します(実行はしません)。 永続的な保存はIDAのネットノード機能を使用して実現されます。
  • !ks: kvコマンドの出力をデバッガマークアップ言語(DML)で強化したものです。コードアドレス(!jmpto)とデータアドレス(dc)がクリック可能です。
  • !translate : IDAから使用することを意図しています(Alt-F2ショートカット)。モジュールの名前とオフセットに基づいてアドレスをリベースします。

アドレスオプション引数

!cmt、!rcmt、!fcmtコマンドは、オプションのアドレスオプションをサポートしています:-a または --address。 アドレスは16進数値として渡す必要があります。コマンドの解析はPythonの argparse モジュールに基づいています。 行の解析を停止するには -- を使用します。``` [WinDbg] 0:000:x86> !cmt -a 0x430DB2 comment

root@kitploit:~
アドレスは有効な命令のアドレスでなければなりません。

## GNU gdb (GDB) の使用法

ホストとの同期:```
    gdb> sync
    [sync] sync is now enabled with host 192.168.52.1
    <not running>

    gdb> r
    Starting program: /bin/ls
    [Thread debugging using libthread_db enabled]
    Using host libthread_db library "/lib/libthread_db.so.1".

GDBプラグインコマンド

コマンドを使用する場合、"!"プレフィックスなしで``` (gdb) cmd x/i $pc [sync] command output: => 0x8049ca3: push edi

root@kitploit:~
(gdb) synchelp
[sync] extension commands help:
 > sync <host>
 > syncoff
 > cmt [-a address] <string>
 > rcmt [-a address] <string>
 > fcmt [-a address] <string>
 > cmd <string>
 > bc <on|off|>
 > rln <address>
 > bbt <symbol>
 > patch <addr> <count> <size>
 > bx /i <symbol>
 > cc
 > translate <base> <addr> <mod>
root@kitploit:~
* **rln**: 指定されたアドレスのIDBからシンボルを取得
* **bbt**: 美しいバックトレース。**bt**と似ていますが、逆アセンブラからシンボルを要求します```
    (gdb) bt
    #0  0x0000000000a91a73 in ?? ()
    #1  0x0000000000a6d994 in ?? ()
    #2  0x0000000000a89125 in ?? ()
    #3  0x0000000000a8a574 in ?? ()
    #4  0x000000000044f83b in ?? ()
    #5  0x0000000000000000 in ?? ()
    (gdb) bbt
    #0 0x0000000000a91a73 in IKE_GetAssembledPkt ()
    #1 0x0000000000a6d994 in catcher ()
    #2 0x0000000000a89125 in IKEProcessMsg ()
    #3 0x0000000000a8a574 in IkeDaemon ()
    #4 0x000000000044f83b in sub_44F7D0 ()
    #5 0x0000000000000000 in  ()
  • patch: ライブコンテキストに基づいて逆アセンブラでバイトをパッチします

  • bx: 美しい表示。x に似ていますが、シンボルを使用します。シンボルは逆アセンブラによって解決されます。

  • cc: 逆アセンブラでカーソルまで続行します。これは F3 を使用してワンショットブレークポイントを設定し、F5 で続行する代わりの方法です。gdb から操作したい場合に便利です。``` (gdb) b* 0xA91A73 Breakpoint 1 at 0xa91a73 (gdb) c Continuing.

    Breakpoint 1, 0x0000000000a91a73 in ?? () (gdb) cc [sync] current cursor: 0xa91a7f [sync] reached successfully (gdb)

root@kitploit:~
## LLDB の使い方

1. ホストと同期する```
    lldb> process launch -s
    lldb> sync
    [sync] connecting to localhost
    [sync] sync is now enabled with host localhost
    [sync] event handler started
  1. コマンドを使用する``` lldb> synchelp [sync] extension commands help:

    sync = synchronize with or the default value syncoff = stop synchronization cmt = add comment at current eip in IDA rcmt = reset comments at current eip in IDA fcmt = add a function comment for 'f = get_func(eip)' in IDA cmd = execute command and add its output as comment at current eip in IDA bc <on|off|> = enable/disable path coloring in IDA color a single instruction at current eip if called without argument lldb> cmt mooo

root@kitploit:~
## OllyDbg 1.10 の使用方法

1. プラグインメニューまたはショートカットを使用して、同期を有効(``Alt+s``)/無効(``Alt+u``)にします。


## OllyDbg2 の使用方法

1. プラグインメニューまたはショートカットを使用して、同期を有効(``Ctrl+s``)/無効(``Ctrl+u``)にします。

OllyDbg2 API のベータ版ステータスのため、以下の機能のみが実装されています:

- グラフ同期 [``F7``; ``F8`` でステップ実行]
- コメント   [``CTRL+;`` を使用]
- ラベル     [``CTRL+:`` を使用]


## x64dbg の使用方法

1. プラグインメニューまたはコマンドを使用して、同期を有効("``!sync"``)または無効("``!syncoff``")にします。

2. コマンドを使用します```
[sync] synchelp command!
[sync] extension commands help:
 > !sync                          = synchronize with <host from conf> or the default value
 > !syncoff                       = stop synchronization
 > !syncmodauto <on | off>        = enable / disable idb auto switch based on module name
 > !synchelp                      = display this help
 > !cmt <string>                  = add comment at current eip in IDA
 > !rcmt <string>                 = reset comments at current eip in IDA
 > !idblist                       = display list of all IDB clients connected to the dispatcher
 > !idb <module name>             = set given module as the active idb (see !idblist)
 > !idbn <n>                      = set active idb to the n_th client. n should be a valid decimal value
 > !translate <base> <addr> <mod> = rebase an address with respect to local module's base
 > !insync                        = synchronize the selected instruction block in the disassembly window.

Note: ディスアセンブラ(IDA/Ghidra、Alt-F2 ショートカット)から !translate コマンドを使用すると、ディスアセンブラウィンドウが特定のアドレスに「ジャンプ」します(x64dbg コマンドラインで disasm を実行するのと同等)。

Pythonライブラリの使用方法

完全なデバッグ環境が利用できない場合やカスタムツールを使用する場合でも、ret-sync のコア機能(ディスアセンブラとの位置同期、シンボル解決)を利用したい場合があります。そのために、ミニマルなPythonライブラリが抽出されました。

以下の例では、イベントベースのログ/トレースツールの出力を処理するスクリプトを使用したPythonライブラリの使用方法を示しています。```python from sync import *

HOST = '127.0.0.1'

MAPPINGS = [ [0x555555400000, 0x555555402000, 0x2000, " /bin/tempfile"], [0x7ffff7dd3000, 0x7ffff7dfc000, 0x29000, " /lib/x86_64-linux-gnu/ld-2.27.so"], [0x7ffff7ff7000, 0x7ffff7ffb000, 0x4000, " [vvar]"], [0x7ffff7ffb000, 0x7ffff7ffc000, 0x1000, " [vdso]"], [0x7ffffffde000, 0x7ffffffff000, 0x21000, " [stack]"], ]

EVENTS = [ [0x0000555555400e74, "malloc"], [0x0000555555400eb3, "open"], [0x0000555555400ee8, "exit"] ]

synctool = Sync(HOST, MAPPINGS)

for e in EVENTS: offset, name = e synctool.invoke(offset) print(" 0x%08x - %s" % (offset, name)) print("[>] press enter for next event") input()

root@kitploit:~
# 拡張

当初は動的解析(デバッガ)に焦点を当てていましたが、もちろんプラグインセットを拡張して他のツールと統合することも可能です。

- [Tetrane](https://www.tetrane.com/) による **REVEN** Timeless Analysis and Debugging Platform との統合:
  - http://blog.tetrane.com/2015/02/reven-in-your-toolkit.html
  - https://twitter.com/tetrane/status/1374768014193799175
- Assaf Carlsbad([@assaf_carlsbad](https://twitter.com/assaf_carlsbad))による **EFI DXE Emulator** との統合:
  - https://twitter.com/assaf_carlsbad/status/1242114356881641474
  - https://github.com/assafcarlsbad/efi_dxe_emulator

その他のリソース:

- Jean-Christophe Delaunay による「*Combining static and dynamic binary analysis - ret-sync*」
  - https://www.synacktiv.com/ressources/bieresecu1_ret-sync_en.pdf


# TODO

- もちろん。

# 既知のバグ/制限事項

- Python 2.7/3.7、IDA 7.7(Windows、Linux、Mac OS X)、Ghidra 10.1.1、Binary Ninja 3.0.3225-dev、GNU gdb (GDB) 8.1.0 (Debian)、lldb 310.2.37 でテスト済み。
- 当事者間には**認証/暗号化は一切ありません**。自己責任でお願いします。
- 自己変更コードは対象外です。

GDB の場合:

- 'return' コマンドを使用した場合、stop イベントが呼び出されないようです。
- マルチスレッドデバッグではシグナルに問題があります。

WinDbg の場合:

- IDA のクライアントプラグインは、遭遇したブレークポイントが継続させるコマンド文字列(`g`)を使用している場合でも通知を受け取ります。これらのイベントが多すぎると、大幅な速度低下を引き起こす可能性があります。限定的な修正が実装されていますが、最善の解決策は一時的に同期をオフにすることです。
- レースコンディションの可能性

Ghidra の場合:

- 逆コンパイラウィジェットでショートカットが期待通りに動作しません。

IDA の場合:

- 大きなグラフの場合、グラフウィンドウの再描画が非常に遅いです。
- **ret-sync** のショートカットが Linux 環境で競合します。

競合:

- Logitech Updater ソフトウェアが同じデフォルトポート (9100) を使用することが知られています。解決策は、グローバルな `.sync` 設定ファイルを使用して別のポートを定義することです。```
[INTERFACE]
host=127.0.0.1
port=9234

ライセンス

ret-sync はフリーソフトウェアです。あなたはこれを、フリーソフトウェア財団によって発行されたGNU General Public License(バージョン3、または(あなたの選択により)それ以降のバージョン)の条件の下で再頒布および/または改変することができます。

このプログラムは有用であることを期待して配布されていますが、いかなる保証もありません。暗黙の商品性保証や特定目的への適合性の保証も含めて、一切の保証はありません。詳細については、GNU General Public Licenseをご覧ください。

このプログラムと共にGNU General Public Licenseの写しを受け取っているはずです。受け取っていない場合は、http://www.gnu.org/licenses/ をご覧ください。

Binary NinjaプラグインはMITライセンスの下でリリースされています。

謝辞

Bruce Dang、StalkR、@Ivanlef0u、Damien Aumaître、Sébastien Renaud、Kévin Szkudlapski、@m00dy、@saidelike、Xavier Mehrenberger、ben64、Raphaël Rigo、Jiss の皆様のご厚意、ご助力、フィードバック、ご意見に感謝します。Ilfak Guilfanov、Igor Skochinsky、Arnaud Diederen の皆様には、IDAの内部に関するご助力と卓越したサポートをいただきました。Jordan Wiens 氏と Vector 35 社に感謝します。最後に、すべてのコントリビューター、そして問題やバグを報告してくださった皆様にも感謝します。

ツールをダウンロード