当我在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
答案 0 :(得分:1)
cmpb $0x0,(%edx,%eax,1)
表示“将0
与edx + 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 。