GDBを使ってx86プログラムをデバッグしています。私はfunc1という特定の機能を持っています。GDB(x86)を使ってスタックを調べる
スタックを調べて、渡された引数を確認したいと思います。だから、次のようにして:
(gdb) info frame 0
Stack frame at 0x7fffffffe1f0:
rip = 0x400e70 in func4; saved rip 0x40115a
called by frame at 0x7fffffffe210
Arglist at 0x7fffffffe1e0, args:
Locals at 0x7fffffffe1e0, Previous frame's sp is 0x7fffffffe1f0
Saved registers:
rip at 0x7fffffffe1e8
私は、引数が0x7fffffffe1e0
であることを知っています。実行することによって:
(gdb) x/8x 0x7fffffffe1e0
0x7fffffffe1e0: 0x08 0xe3 0xff 0xff 0xff 0x7f 0x00 0x00
なぜこのアドレスにすべての16進数が含まれていますか?彼らは何ですか?また、どのように多くの議論があるのか、私はどのように分かりますか? info localsまたはinfo argsを実行すると、シンボルテーブルがロードされていないことが示されます。
また、私は最初の引数が0x7fffffffe1e0 + 0x8にあり、2番目が0x7fffffffe1e0 + 0xcなどであることを知っています。しかし、どのように多くの引数があるのでしょうか?これにより
:
(gdb) x 0x7fffffffe1e0 + 0x8
0x7fffffffe1e8: 0x5a
(gdb) x/d 0x7fffffffe1e0 + 0x8
0x7fffffffe1e8: 90
(gdb) x/c 0x7fffffffe1e0 + 0x8
0x7fffffffe1e8: 90 'Z'
を、私は最初の引数はZまたは90のいずれかは、それがある1把握するためにどのような方法がありますされていることを知っていますか?
そして
(gdb) x 0x7fffffffe1e8 + 0xc
0x7fffffffe1f4: -1 '\377'
(gdb) x/s 0x7fffffffe1e8 + 0xc
0x7fffffffe1f4: "\377\177"
(gdb) x/d 0x7fffffffe1e8 + 0xc
0x7fffffffe1f4: -1
を行うことで、私は2番目の引数が-1することができることを知っています。
行う
(gdb) x 0x7fffffffe1e8 + 0x10
0x7fffffffe1f8: 10
私は3番目の引数は、私がどのように多くの引数がいることを知っているだろうかだから、10
ことが「可能性」ということを知っていますか?数字や文字を見つけたら、どちらの文字かを判断する方法はありますか?
ありがとうございました!