
ghidra Ghidra_12.1.3_build
Ghidraは、ソフトウェアリバースエンジニアリング(SRE)フレームワークです。
Dockerized Ghidra
ビルド
Ghidra リリースのルートディレクトリから、以下のコマンドを実行します。
./docker/build-docker-image.sh
これにより、Ghidra のリリースバージョンに対応するタグを持つ ghidra Docker イメージがビルドされます。
MODE 環境変数
Ghidra Docker コンテナは、以下の MODE の実行をサポートしています:
- gui
- headless
- ghidra-server
- bsim
- bsim-server
- pyghidra
MODE 環境変数は、実行する Ghidra のエントリポイントを指定します。
コンテナ起動時に entrypoint.sh スクリプトが実行されます。
コンテナの設定
コンテナの設定は、他の Docker コンテナと同様に行います。 ボリュームのマウント、環境変数の設定、ポートのコンテナからホストへのマッピングなどが可能です。 設定手順は、コンテナを起動する MODE によって大きく異なります。
コンテナ内の Ghidra のベースディレクトリは /ghidra にあります。
ファイル、設定などの Ghidra のデフォルトの場所はすべてその中にあります。
Ghidra はコンテナ内でユーザー ghidra(uid 1001、guid 1001)として実行されます。
ghidra ユーザーは、コンテナ内の以下のディレクトリにのみアクセス権限があります:
/ghidra/home/ghidra
docker run コマンドで引数が渡されない場合、実行される MODE に対応するコマンドラインインターフェース(CLI)が使用法を表示します。
ローカルボリュームのコンテナへのマッピング
コンテナ内のボリュームは、グループ ID 1001 のユーザーがアクセスできない場合、権限の問題が発生する可能性があります。
コンテナのデフォルトの uid と guid は 1001:1001 です。コンテナにマッピングされるボリュームは、この uid/guid がアクセス可能である必要があります。
ホストマシンのユーザーをホストのグループ 1001 に追加すると、コンテナで使用されるボリュームの管理に役立ちます。
これは Linux で sudo usermod -aG 1001 <user> を実行することで簡単に行えます。
ヘッドレスモードの例
docker run \
--env MODE=headless \
--rm \
--volume /path/to/myproject:/home/ghidra/myproject \
--volume /path/to/mybinary:/home/ghidra/mybinary \
ghidra/ghidra:<version> \
/home/ghidra/myproject programFolder -import /home/ghidra/mybinary
これを一行ずつ分解すると:
docker runは、イメージghidra/ghidra<:<version>を使用して docker コンテナを起動します--env MODE=headlessは、コンテナ内の環境変数MODEを値headlessに設定します--rmはコマンド完了後にコンテナを削除します--volume /path/to/myproject:/home/ghidra/myprojectは、ホスト上のローカルボリューム/path/to/myprojectをコンテナ内の/home/ghidra/myprojectにマウントします--volume /path/to/mybinary:/home/ghidra/mybinaryは、ホスト上のローカルボリューム/path/to/mybinaryをコンテナ内の/home/ghidra/mybinaryにマウントしますghidra/ghidra:<version>は Docker イメージの完全な参照であり、ghidra/ghidraはイメージのグループと名前、<version>はタグです。/home/ghidra/myproject programFolder -import /home/ghidra/mybinaryは、Ghidra のヘッドレスアナライザのコマンドラインインターフェースに渡される引数です。
引数が渡されない場合、ヘッドレスアナライザの使用法が表示されます。
ホスト上の /path/to/myproject は、guid 1001 が rwx パーミッションでアクセス可能である必要があります。
GUI モードの例
Docker コンテナ内で Ghidra のグラフィカルユーザーインターフェース(GUI)を実行することは、推奨される Ghidra の実行方法ではありません。 GUI は Docker 化されたアプリケーションの典型的なユースケースではありません。
docker run \
--env MODE=gui \
-it \
--rm \
--net host \
--env DISPLAY \
--volume "$HOME/.Xauthority:/home/ghidra/.Xauthority" \
ghidra/ghidra:<version>
このモードでは、コンテナは X11 転送に依存して GUI を表示します。X11 の設定は異なる場合がありますが、この場合、 ホストの Xauthority ファイルがコンテナにマウントされ、コンテナはホストのネットワークを使用するように設定され、DISPLAY 環境変数がコンテナに渡されます。これにより、GUI をホストマシンのディスプレイに転送できます。バイナリを含むボリュームや ghidra プロジェクト用のボリュームも コンテナにマウントする必要があります。
ホストの .Xauthority ファイルは適切なパーミッション(グループ :1001 に rw グループパーミッションを割り当て)を持っている必要があります。
Ghidra サーバーモードの例
docker run \
--env MODE=ghidra-server \
--rm \
-it \
--volume /path/to/my/repositories:/ghidra/repositories \
--volume /path/to/my/configs/server.conf:/ghidra/server/server.conf \
-p 13100:13100 \
-p 13101:13101 \
-p 13102:13102 \
ghidra/ghidra:<version>
リポジトリやユーザーを保存し、サーバーを設定するために、サーバーコンテナにボリュームをマウントする必要があります。
svrAdmin を使用するには、実行中の ghidra サーバーコンテナに exec して(docker exec -it <container-id> bash)コンテナ内で bash シェルを取得します。
コンテナに exec した後、Ghidra サーバーの管理と運用は、コンテナ化されていない環境と同じです。
コンテナを停止するには、docker stop <container-id> コマンドを実行します。
注: ホストから Docker コンテナにマップするポートは一致している必要があります。server.conf ファイル内で -p<port> オプションを使用して、デフォルトのベースサーバーポート(例: 13100)を変更できます。
BSIM サーバーモードの例
docker run \
--env MODE=bsim-server \
--rm \
-it \
--volume /path/to/my/datadir:/ghidra/bsim_datadir \
-p 5432:5432 \
ghidra/ghidra:<version> \
/ghidra/bsim_datadir
/ghidra/bsim_datadir は、コンテナ内で bsim のデータを保存するために使用されるディレクトリです。コンテナ上で他のディレクトリを使用することもできますが、
ホストマシン上のフォルダが適切なパーミッション(グループ :1001 に割り当て)を持っていることを確認してください。
この例では、単に bsim サーバーを起動します。bsim サーバーの設定とデータの投入は、起動後にコンテナ内で ghidra サーバーの管理と同様の方法で行うことができます。
管理者は実行中の bsim サーバーコンテナに exec し(docker exec -it <container-id> bash)、
コンテナに exec した後、Bsim サーバーの管理と運用はコンテナ化されていない環境と同じです。
コンテナを停止するには、docker stop <container-id> コマンドを実行します。
BSIM CLI モードの例
docker run \
--env MODE=bsim \
--rm \
-it \
ghidra/ghidra:<version> \
generatesigs ghidra://ghidrasvr/demo /home/ghidra \
--bsim postgresql://bsimsvr/demo \
--commit --overwrite \
--user ghidra
この例では、bsim CLI を使用して ghidrasvr でホストされている ghidra サーバーに接続し、
その ghidra サーバーの demo リポジトリのシグネチャを生成して /home/ghidra に保存し、
その後、bsimsvr でホストされている BSIM サーバーの demo データベースにシグネチャをコミットします。
Pyghidra GUI モードの例
Docker コンテナ内で Ghidra のグラフィカルユーザーインターフェース(GUI)を実行することは、推奨される Ghidra の実行方法ではありません。 GUI は Docker 化されたアプリケーションの典型的なユースケースではありません。
docker run \
--env MODE=pyghidra \
-it \
--rm \
--net host \
--env DISPLAY \
--volume="$HOME/.Xauthority:/home/ghidra/.Xauthority:rw" \
ghidra/ghidra:<version> -c
このモードでは、コンテナは X11 転送に依存して GUI を表示します。X11 の設定は異なる場合がありますが、この場合、 ホストの Xauthority ファイルがコンテナにマウントされ、コンテナはホストのネットワークを使用するように設定され、DISPLAY 環境変数がコンテナに渡されます。これにより、GUI をホストマシンのディスプレイに転送できます。バイナリを含むボリュームや ghidra プロジェクト用のボリュームも コンテナにマウントする必要があります。
ホストの .Xauthority ファイルは適切なパーミッション(:1001 が所有し、rw グループパーミッション)を持っている必要があります。
Pyghidra ヘッドレスモードの例
docker run \
--env MODE=pyghidra \
--rm \
--volume /path/to/myproject:/myproject \
--volume /path/to/mybinary:/mybinary \
ghidra/ghidra:<version> -H \
/myproject programFolder -import /mybinary
pyghidra ヘッドレスアナライザに引数が渡されない場合、ヘッドレスアナライザと同様にヘルプメニューが表示されます。
このユースケースはヘッドレスモードの例と非常に似ていますが、Ghidra スクリプトに python3 を利用できるという利点があります。
繰り返しになりますが、この例では、権限の問題を回避するために、/path/to/myproject と /path/to/mybinary に適切なパーミッションとグループ割り当てが必要です。