2

これは、gdb でデバッグしているバイナリの 2 行です。これは IA32 用に gcc でコンパイルされた C コードです。

8049345:    8b 45 08                mov    0x8(%ebp),%eax
8049348:    89 04 24                mov    %eax,(%esp)

各ステップの後に値が表示されるようにdisplay $eax設定しました。最初の行の後に、次のように表示されdisplayます6: $eax = 134527652

x 134527652表示と x で異なる結果が得られるのx $eax0x804baa4 <input_strings+100>: "1 1 1 1 1 1"なぜですか?

私が信じている次の行は、eax を esp によって保存されたアドレスに移動することを示していますか? display $espセットアップがあり、次のように表示されます2: $esp = (void *) 0xffffd540

2 番目の動きの前に、私x 0xffffd540は見ます:0xffffd540: ""動きの後、私は繰り返して見ます:

0xffffd540:  "\244\272\004\bY\233\004\b\210\325\377\377\214\325\377\377\220\325\377\377\224\325\377\377\230\325\377\377\234\325\377\377\001"

この行は eax をこのアドレスに移動しようとしていると思っていましたが、明らかにここで何かを理解していませんか? バイナリから他の行を見たい場合はお知らせください。

4

1 に答える 1

2

xコマンドがアドレス 0xffffd540 のデータを文字列として出力しているという事実が原因で混乱が生じている可能性があると思います。おそらくそのアドレスへのストアの前に、0xffffd540 の最初のバイトは 0 バイトであり、文字列の終端として扱われるため""、空の文字列が表示されます。値 0x804baa4 をこのアドレスに書き込むと、その表現がバイト単位で表示されます。

\244\272\004\b

ここで、\244(8 進エスケープ) は 0xa4、0xba、\2720x04 \004\b(バックスペース文字のエスケープ、U+0008) は 0x08 です。

たまたま null ターミネータがなくなったため、出力された文字列の後にさらにジャンクが表示されます。

于 2013-01-26T03:29:01.903 に答える