12

基本的に、GDBのレジスタに格納されているアドレスからオフセットされたメモリアドレスの値を出力する方法を考えています。たとえば、次のアセンブリ ラインを考えてみましょう。

mov 0x34(%esp),%edx

私の理解では、これはスタック ポインターが指すアドレスの 52 バイト後の値を取得し、その値を edx レジスター内に格納します。この場合、値は文字列なので、char * が格納されます。edx レジスターで GDB 内の inspect コマンドを使用する場合:

x/s $edx

想定どおりに文字列を出力します。ただし、このコマンドを使用してコピー元の場所を直接調べて文字列を出力しようとすると、次のようになります。

x/s $esp + 0x34

ガベージを出力します。どうしてこれなの?GDB コマンドの構文を誤解していますか、それとも別の何かですか?

4

2 に答える 2

10

xコマンドは、指定されたレジスターが指すアドレスのデータを印刷します。たとえば、レジ​​スタx/s $edxの値で定義されたアドレスから始まる文字列を出力しますedx。また、アドレス自体も出力する必要があります。

isの値とespis0x7fffff00からロードされ0x34(%esp)た値を仮定しましょう。 次のような方法で文字列を locationに出力します。edx0x43210x/s $edx0x43210

(gdb) x/s $esp
0x0x43210:   "hello world!"

Whilex/s $esp + 0x34は実際に から始まる文字列を出力しようとします0x7fffff34。そこには実際の文字列へのポインターがあるため、そうすると、x/wx $esp + 0x34文字列へのポインターが表示されるはずです ( 0x43210)。表示される「ガベージ」は、文字列として表されるこのポインター (およびそれに続くデータ) です。

于 2013-10-24T07:11:06.000 に答える