0

当我在 GDB 中取消与将程序输入与“密码短语”进行比较相关的功能时,我在这里有输出。我知道真正的“密码”在 $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

密码在EDX而不是EAX中。所以你想跑

(gdb) p (char*)$edx

查看以 null 结尾的字符串的内容。

您可以说您需要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

于 2013-03-08T22:41:53.907 回答