0

プログラム入力を「パスフレーズ」と比較することに関連する関数をGDBでdisasすると、ここに出力があります。本当の「パスフレーズ」が $eax にあることはわかっていますが、$eax を調べようとすると、アドレスが範囲外であるというエラーが表示されます。$eax を調べるにはどうすればよいですか?

Dump of assembler code for function s:
   0x08048444 <+0>:     push   %ebp
   0x08048445 <+1>:     mov    %esp,%ebp
   0x08048447 <+3>:     mov    0x8(%ebp),%edx
   0x0804844a <+6>:     mov    $0x0,%eax
   0x0804844f <+11>:    cmpb   $0x0,(%edx)
   0x08048452 <+14>:    je     0x804845d <s+25>
   0x08048454 <+16>:    add    $0x1,%eax
=> 0x08048457 <+19>:    cmpb   $0x0,(%edx,%eax,1)
   0x0804845b <+23>:    jne    0x8048454 <s+16>
   0x0804845d <+25>:    pop    %ebp
   0x0804845e <+26>:    ret
4

2 に答える 2

1
cmpb $0x0,(%edx,%eax,1)

0「のバイトと比較する」ことを意味しますedx + eax * 1

アドレス指定しているバイトを確認するには、edx ( p/x $edx)eax ( ) を確認する必要があります。p/x $eax

于 2013-03-08T04:12:14.317 に答える
1

パスフレーズはEAXではなくEDXです。だからあなたは走りたいと思うでしょう

(gdb) p (char*)$edx

null で終了する文字列の内容を表示します。

コードが関数の最初の引数を EDX に移動するため、EDXが必要であることがわかります。

0x08048447 <+3>:     mov    0x8(%ebp),%edx

EAXがインデックスとして使用されているためです。最初に 0 に設定され、次にループで 1 ずつインクリメントされます。

0x0804844a <+6>:     mov    $0x0,%eax
<...>
0x08048454 <+16>:    add    $0x1,%eax
0x08048457 <+19>:    cmpb   $0x0,(%edx,%eax,1)
0x0804845b <+23>:    jne    0x8048454 <s+16>

0と比較(%edx,%eax,1)した後、コードがジャンプしてEAXをインクリメントする方法に注意してください。

于 2013-03-08T22:41:53.907 に答える