gdb-peda 便利コマンド集

reversing pwn gdb gdb-peda

gdb-peda(GDB の拡張)でよく使うコマンドの早見表。x/ でメモリを表示するコマンドは「GDB の x コマンド(メモリの表示)」のノートを参照。

コマンド一覧

やりたいこと コマンド 例 説明
直前のコマンドを繰り返す Enter(空入力) stepi の後に Enter 同じコマンドをもう一度実行する。x の後に押すと、続きのアドレスから表示する
スタックなどをポインタを辿りながら見る telescope <ADDRESS> <LINES>(tel) tel $rbp-8*4 5 指定したアドレスから 1 ワード(64bit なら 8 バイト)ずつ表示する。値がポインタなら、参照先の値や文字列まで辿って表示する。PEDA が追加するコマンド
レジスタの値を 16 進で見る print/x $<REGISTER>(p/x) p/x $rax レジスタに入っている値を 16 進数で表示する
変数のアドレスを調べる p &<VAR_NAME> p &secret グローバル変数などのアドレスを表示する
メモリに値を書き込む set {<TYPE>}<ADDRESS> = <VALUE> set {int}0x7fffffffe438 = 0x00414141 指定したアドレスに、型のサイズ分だけ値を書き込む

補足

  • tel $rbp-8*4 5 は、$rbp から 8×4 = 32(0x20)バイト小さいアドレスから 5 ワード分を表示する。メモでは「84 バイト上位」と書いていたが、8*4 は掛け算で、- なので下位(小さい)アドレス側になる。x86-64 のスタックは小さいアドレスに向かって伸びるので、$rbp より小さいアドレスにはローカル変数が置かれている。
  • print/x $rax で表示されるのはレジスタに入っている「値」で、レジスタのアドレスではない(レジスタはメモリ上にないので、アドレスを持たない)。値がアドレスになっていれば、そのまま x や tel に渡して中身を見られる。
  • p &secret で変数名を使えるのは、バイナリにシンボル情報が残っているとき。strip されたバイナリでは使えない。
  • set の書き込みサイズは型で決まる。{int} は 4 バイト、8 バイト書きたいときは {long} を使う(x86-64 の Linux の場合)。x86 はリトルエンディアンなので、0x00414141 はメモリ上では 41 41 41 00 の順で並び、文字列として読むと "AAA" になる。