2012-01-25 8 views
0

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

ことが「可能性」ということを知っていますか?数字や文字を見つけたら、どちらの文字かを判断する方法はありますか?

ありがとうございました!

答えて

3

スタックを調べて、渡された引数を確認したいと思います。

あなたは明らかにx86_64プラットフォームにあります。

使用する呼び出し規約を知っておく必要があります。特に、関数の引数はであり、スタックにはが渡されていないことに注意してください(6つを超える場合を除いて)、あなたの疑問は悪い仮定から始まります。

You は、最初に引数がないので、スタックを調べてください。