読者です 読者をやめる 読者になる 読者になる

gdbでアドレスが指す先のアドレスをdereferenceするコマンドを作った

gdbであるアドレスがアドレスを指している場合のdereferenceを簡単にやりたかったのでpythonでコマンド作ってみました。

これは例えばcのコードがこうで、

void func(char *p) 
{
        printf("[*] %s\n", p);
}

func()のディスアセンブル結果にこのような処理があるとします。

   0x000000000040066e <+8>:     mov    %rdi,-0x8(%rbp)

このとき、rbp - 8のアドレスは0x7fffffffdc68で、ここはアドレス0x0000000000602010を指しています。

(gdb) x/gx $rbp - 8
0x7fffffffdc68: 0x0000000000602010

このアドレスが指す内容は以下のようにしてdereferenceできますが、ちょっと面倒ですよね。

(gdb) x/s *(char **) ($rbp - 0x8)
0x602010:       "test"

ということで、作ったのがこちらです。

github.com

xコマンドのシンタックスを使う感じでdgp s $rbp - 8というように使えます。

f:id:masami256:20170108223631p:plain

その他、こんな感じです。

(gdb) dgp s $rbp - 8                                                                                                                                                                                               
[*]execute: x/gx $rbp - 8
[*]execute: x/s 0x0000000000602010
0x602010:       "test"

(gdb) dgp 4c $rbp - 8
[*]execute: x/gx $rbp - 8
[*]execute: x/4c 0x0000000000602010
0x602010:       116 't' 101 'e' 115 's' 116 't'

(gdb) dgp 4s $rbp - 8
[*]execute: x/gx $rbp - 8
[*]execute: x/4s 0x0000000000602010
0x602010:       "test"
0x602015:       ""
0x602016:       ""
0x602017:       ""

(gdb) dgp wx $rbp
[*]execute: x/gx $rbp + 0
[*]execute: x/wx 0x00007fffffffdca0
0x7fffffffdca0: 0x00400720

pythongdbの拡張できるの便利ですね〜

( ´ー`)フゥー...