2013-03-08 117 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