もくじ
WSL2 と Windows Terminal で pwntools のデバッグ機能を使う際に、コンテキスト設定で画面の分割比率を変更する方法についてのメモ書きです。
ついでに、WSL2 & Windows Terminal 環境で gdb-peda を使用する際に pwntools を使うとレジスタ情報を参照できなくなる問題の回避策についてもまとめています。
画面の分割幅を変更する方法
WSL2 & Windows Terminal で pwntools の gdb.debug() を使用する場合、デフォルトでは以下のコマンドでデバッグターミナルが起動されるようです。
['/mnt/c/Windows/system32/cmd.exe', '/c', 'start', 'wt.exe', '-w', '0', 'split-pane', '-d', '.', 'wsl.exe', '-d', 'Ubuntu', 'bash', '-c', '/tmp/tmpnhyc4xx1']
このコンテキストでは、wt.exe -w 0 split-pane -d .
を使用して現在使用中のウインドウ内でデフォルトプロファイルを使用してペイン分割したターミナルを起動します。
参考:Windows ターミナルのコマンド ライン引数 | Microsoft Learn
しかし、このままではウインドウの分割幅が 5:5 に強制されてしまい、あとから変更できなくなるため、デバッグを行うには少々不便です。
そのため、Window Terminal の split-pane 機能の -s
オプションにより分割幅の指定をコンテキストに加えることで、デバッグウインドウのサイズを大きくすることができます。
実際に私が使用しているコンテキストは以下のものです。
context.terminal = ["/mnt/c/Windows/system32/cmd.exe", "/c", "start", "wt.exe", "-w", "0", "sp", "-s", ".7", "-d", ".", "wsl.exe", '-d', "Ubuntu", "bash", "-c"]
この設定を pwntools を使用する Python スクリプト内で定義することで、以下のように分割時の画面の比率を 3:7 として、デバッグウインドウをより広くすることができます。
おまけ:pwntools と gdb-peda を WSL2 & Windows Terminal で使用する場合の問題
原因は全く不明ながら、Windows Terminal と WSL2 の環境で pwntools の gdb.debug() を使用すると、gdb-peda のレジスタビューが機能しなくなる問題が発生します。
同じ環境で普通に gdb コマンドを実行する分にはレジスタビューの情報も正常に表示されるため、pwntools の gdb モジュール(というよりは恐らく gdbserver ?) を利用しているのが原因なような気がします。
解決方法 1:tmux を使用する
原因の特定には至ってませんがとりあえず tmux を使用することで問題の発生を回避できることは確認しました。
まずは pwntools のスクリプトを実行するターミナルで tmux を起動します。
続けて、context.terminal
を以下のように置き換えた pwntools のスクリプトを実行します。
context.terminal = ["tmux", "splitw", "-h"]
これで、WSL2 & Windows Terminal の環境でも gdb-peda のレジスタ情報を参照できるようになります。
解決方法 2:gef や pwndbg を使用する
もう 1 つの解決方法として、そもそも gdb-peda の利用をやめる方法があります。
確認したところ、gef や pwndbg を使用する場合には WSL2&Windows Terminal の環境で pwntools の gdb.debug() を使用する場合でもレジスタ情報を含む情報を正常に表示することができました。
そのため、私はずっと gdb-peda を愛用してきたものの、残念ながらこれを機に pwndbg に切り替えることにしました。
参考:pwndbg/pwndbg: Exploit Development and Reverse Engineering with GDB Made Easy
まとめ
メモ書きです。