2013-03-08 121 views
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 
+1

你的意思是你使用'x $ edx'? 「p $ edx」是什麼意思? – 2013-03-08 03:28:05

+0

糟糕,重寫了這個問題。對於那個很抱歉。問題實際上是關於$ eax。 – theman 2013-03-08 03:34:29

+0

,我正在使用x $ eax。它給了我這個輸出: '0x1:<地址0x1越界>' – theman 2013-03-08 03:38:15

回答

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

辦法 「比較0以字節爲edx + eax * 1」。

你需要看看EDX(p/x $edx EAX(p/x $eax),看看你解決什麼字節。

+0

%edx不僅用作SIB字節中的基址寄存器,而且%eax在函數開始時顯式設置爲0,而%edx接收函數參數:0x08048447 <+3>:mov 0x8(%ebp), %EDX; 0x0804844a <+6>:mov $ 0x0,%eax'。 – mkfs 2013-03-08 17:15:02

1

該密碼在EDX而不是EAX。所以你想運行

(gdb) p (char*)$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> 

注意如何比較(%edx,%eax,1)爲0後的代碼跳回遞增EAX