
LLDB、GDB、VDB、WinDbg向けにカスタマイズ可能なレジスタ、逆アセンブリ、スタック、メモリ、ブレークポイント、バックトレースビューを提供する拡張可能なデバッガUIツールキット。
Voltron は Python で書かれた拡張可能なデバッガ UI ツールキットです。様々なデバッガ (LLDB, GDB, VDB, WinDbg) のユーザー体験を向上させることを目的としており、デバッガホストからデータを取得して表示するユーティリティビューをアタッチできるようにします。これらのビューを別の TTY で実行することで、ニーズに合わせたカスタマイズされたデバッガユーザーインターフェースを構築できます。
Voltron は万人向けの万能ツールを目指していません。デバッガの CLI を完全に置き換えるものではなく、むしろ既存の環境を補完し、CLI デバッガを好きなだけ拡張できるようにすることを目的としています。デバッガと並べてレジスタ内容を表示するウィンドウが欲しいだけなら、それも可能です。本格的に OllyDbg に似た外観のものを作りたい場合も、同様に可能です。
組み込みのビューとして以下が提供されています:
作者のセットアップは以下のような感じです:
任意のデバッガコマンドをビューに切り出し、指定した Pygments レキサーでハイライト表示できます:
さらにスクリーンショットはこちら。
Voltron は LLDB、GDB、VDB、WinDbg/CDB(PyKD 経由)をサポートし、macOS、Linux、Windows で動作します。
WinDbg サポートはまだ新しいため、問題があればイシューを開いてください。
以下のアーキテクチャがサポートされています:
注記: インストールスクリプトが完全にサポートしているのは macOS と Debian 系ディストリビューションのみです。他の Linux ディストリビューションでもおそらく失敗はしないはずですが、パッケージ依存関係のインストールは試みません。別のディストリビューションを使用している場合は、install.sh を確認して、実行前にインストールが必要な依存関係を調べてください。
ソースをダウンロードしてインストールスクリプトを実行します:
$ git clone https://github.com/snare/voltron
$ cd voltron
$ ./install.sh
デフォルトでは、インストールスクリプトはユーザーの site-packages ディレクトリにインストールします。システムの site-packages にインストールしたい場合は、-s フラグを使用します:
$ ./install.sh -s
仮想環境にも(LLDB のみ)次のようにインストールできます:
$ ./install.sh -v /path/to/venv -b lldb
シェルのない Windows 環境、インストールに問題がある場合、または手動でインストールしたい場合は、手動インストールのドキュメント を参照してください。
デバッガに init スクリプト(LLDB の .lldbinit や GDB の .gdbinit)がある場合、起動時に Voltron を読み込むように設定します。そのためには、entry.py エントリポイントスクリプトを source します。フルパスは voltron パッケージ内にあります。例えば、macOS では /Library/Python/2.7/site-packages/voltron/entry.py などです。install.sh スクリプトは、GDB または LLDB がパスに存在する場合、自動的にこれを .gdbinit または .lldbinit ファイルに追加します。
LLDB:
command script import /path/to/voltron/entry.py
GDB:
source /path/to/voltron/entry.py
デバッガを起動し、必要に応じて Voltron を手動で初期化します。
最近の LLDB バージョンでは、手動で Voltron を初期化する必要はありません:
$ lldb target_binary
古い LLDB バージョンでは、インフェリアをロードした後に voltron init を呼び出す必要があります:
$ lldb target_binary
(lldb) voltron init
github 上の wiki を参照してください。
Q. ImportError が発生して Voltron が読み込めないのはなぜですか?
A. 複数の Python バージョンがインストールされており、間違ったバージョンで Voltron をインストールした可能性があります。詳細なインストール手順を参照してください。
Q. GEF?PEDA?PwnDbg?fG's gdbinit?
A. いずれも GDB 向けの素晴らしい拡張機能です。これらのツールは主にエクスプロイトタスクのための追加コマンド群を提供しますが、それぞれ Voltron と同様にレジスタ、スタック、コードなどのビューを提供する「コンテキスト」表示も備えています。これらのツールはデバッガが停止するたびにデバッガコンソールにコンテキスト表示を出力します。Voltron は、デバッガに RPC サーバーインプラントを埋め込み、他のターミナル(あるいは Web ブラウザ、現在は Binary Ninja との同期も可能)からビューをアタッチできるようにするという異なるアプローチを採用しており、ユーザーはデバッガに対してよりクリーンなマルチウィンドウインターフェースを構築できます。Voltron はこれらのツールすべてと問題なく連携します。お好みの GDB 拡張機能でコンテキスト表示を無効にし、Voltron のビューを接続することで、これらのツールが追加する有用なコマンドの恩恵をすべて受けながら利用できます。
詳細や問題の報告については、github 上のイシュートラッカーを参照してください。
Voltron の読み込み時に ImportError が発生する場合は、お使いのプラットフォームに合わせたインストール手順に従っていることを確認してください。
古い LLDB バージョンでは、voltron init コマンドをデバッグターゲットのロード後に手動で実行する必要があります。これは、Voltron のフックをインストールする前にターゲットがロードされている必要があるためです。Voltron は自動的にイベントハンドラを登録しようとし、voltron init が必要な場合はユーザーに通知します。
WinDbg/CDB サポートの詳細はこちら。
作者は主に macOS 上の最新バージョンの LLDB で Voltron を使用しています。リリース前には可能な限り多くのプラットフォームとアーキテクチャでテストするよう努めていますが、LLDB/macOS/x64 が最も頻繁に使用される組み合わせになる見込みです。願わくば Voltron があなたのペットに火をつけるようなことはありませんが、結果は人それぞれです。
LICENSE ファイルを参照してください。
もしこれを使って嫌いにならなかったなら、カンファレンスで会ったときにビールをおごってください。このライセンスは他のコントリビューターにも適用されます。richo は彼の貢献に対していくつかビールを贈られるに値します。
これに取り組む時間をくださった元雇用主の Assurance と Azimuth Security に感謝します。
Voltron へのすべての貢献に対して richo に称賛を。
fG! の gdbinit がこのプロジェクトの元々のインスピレーションでした。
VDB サポートを実装してくれた Willi に感謝します。
Voltron は現在、逆アセンブリにデバッガホストの内部逆アセンブリメカニズムに加えて Capstone を使用しています。Capstone は強力なオープンソースのマルチアーキテクチャ逆アセンブラであり、次世代のリバースエンジニアリングおよびデバッグツールが構築されています。ぜひご覧ください。
継続的な貢献をしてくれている grazfather に感謝します。
| lldb | gdb | vdb | windbg |
|---|
| x86 | ✓ | ✓ | ✓ | ✓ |
| x86_64 | ✓ | ✓ | ✓ | ✓ |
| arm | ✓ | ✓ | ✓ | ✗ |
| arm64 | ✓ | ✗ | ✗ | ✗ |
| powerpc | ✗ | ✓ | ✗ | ✗ |
GDB:
$ gdb target_binary
VDB:
$ ./vdbbin target_binary
> script /path/to/voltron/entry.py
WinDbg/CDB は Linux ユーザーランドを介した Bash 経由でのみサポートされています。作者は Git Bash と ConEmu でテストしています。PyKD と Voltron はデバッガ起動時に一つのコマンドで読み込めます:
$ cdb -c '.load C:\path\to\pykd.pyd ; !py --global C:\path\to\voltron\entry.py' target_binary
別のターミナル(筆者は iTerm ペインを使用)で UI ビューのいずれかを起動します。LLDB、WinDbg、GDB ではビューは即座に更新されます。VDB ではインフェリアが停止するまで(ブレークポイント、ステップ実行後など)更新されません:
$ voltron view register
$ voltron view stack
$ voltron view disasm
$ voltron view backtrace
ブレークポイントを設定し、インフェリアを実行します。
(*db) b main
(*db) run
デバッガがブレークポイントにヒットすると、ビューが更新され、現在のレジスタ、スタック、メモリなどの状態が表示されます。ビューはデバッガ CLI で各コマンドが実行された後に、デバッガの「ストップフック」メカニズムを使用して更新されます。そのため、ステップ実行するか、続行してブレークポイントにヒットするたびに、ビューが更新されます。