Go 言語のデバッガ delve を用いたバイナリ解析
CTF で Go 言語のプログラムを扱う機会があったため, Go 言語用のデバッガ delve について調べたので覚え書き
検証環境
- Windows 11 Home
- WSL2 Ubuntu 24
delve について
- delve は Go 言語用のデバッグライブラリ
- Go 言語に対しては gdb と比較して扱いやすい
インストール方法
- go コマンドで github からインストールする
go install github.com/go-delve/delve/cmd/dlv@latest
- 以下でバージョンが表示されたらインストール成功
dlv version
dlvコマンドの使用にはあらかじめ go の bin ディレクトリをパスに追加しておく必要がある (~/go/binなど)- 詳しくは 公式 github を参照のこと
デバッグの開始
execコマンドで対象バイナリのデバッグを対話型シェルで行うことが可能
dlv exec $FILE
ブレークポイントの設定
breakコマンドでブレークポイントを指定
break main.main break *$ADDRESS
- 例の上はメイン関数にブレークポイントを仕掛けるコード (Go 言語のメイン関数は
main.main) - アスタリスクの後に特定のアドレスを指定することでブレークポイントを仕掛けることも可能 (例の下)
- 関数名 + オフセットでの指定は用意されていないらしい
逆アセンブル
- 特定の関数について逆アセンブルする場合は以下を使用
disassemble -l $FUNCION
- 例として
main.mainを逆アセンブルする場合は以下となる
disassemble -l main.main
各種実行
- 基本的には gdb に近い形で機能する (省略 OK)
- ブレークポイントまで実行は以下のどちらかを使う
continue c
- 一行ずつの実行は以下のどちらかを使用
next n
レジスタの確認
- レジスタの内容は
regsコマンドで確認可能
regs
- 個々のレジスタについては
printを用いて確認
print RAX
printを用いる場合はレジスタ名を大文字にするらしい
入力について
- delve は scan 系の入力のあるプログラムについて, 通常のデバッグでは扱うことができない
- 既存のプロセスにアタッチする方法ならば標準入力について扱えるようになるらしい (参考サイト)
終了
- 終了は以下のどちらか
quit q