GDB:当地址超出范围时,如何在$ eax找到'密码'?

时间:2013-03-08 03:26:12

标签: c debugging passwords gdb

当我在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

2 个答案:

答案 0 :(得分:1)

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

表示“将0edx + eax * 1处的字节进行比较。”

您需要查看edx(p/x $edx eax(p/x $eax)以查看您正在寻址的字节。

答案 1 :(得分: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