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"になる。