C GDB:如何找到';密码短语';地址超出边界时,在$eax?
当我在GDB中取消与比较程序输入和“密码短语”相关的函数时,这里有输出。我知道真正的“密码短语”在$eax中,但是当我尝试检查$eax时,我得到了一个错误,即地址超出了范围。如何检查$eaxC GDB:如何找到';密码短语';地址超出边界时,在$eax?,c,debugging,passwords,gdb,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>:
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
函数s的汇编程序代码转储:
0x08048444:推送%ebp
0x08048445:mov%esp,%ebp
0x08048447:mov 0x8(%ebp),%edx
0x080484A:mov$0x0,%eax
0x0804844f:cmpb$0x0,(%edx)
0x08048452:je 0x804845d
0x08048454:添加$0x1,%eax
=>0x08048457:cmpb$0x0,(%edx,%eax,1)
0x0804845b:jne 0x8048454
0x0804845d:弹出%ebp
0x0804845e:ret
表示“将0
与edx+eax*1
处的字节进行比较”
您需要查看edx(
p/x$edx
)和eax(p/x$eax
)以查看您正在寻址的字节。密码短语位于edx而不是eax。所以你想跑
(gdb) p (char*)$edx
查看以null结尾的字符串的内容
您可以看出您想要EDX,因为代码将函数的第一个参数移到其中:
0x08048447 <+3>: mov 0x8(%ebp),%edx
0x08048447: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>
0x080484A:mov$0x0,%eax
0x08048454:添加$0x1,%eax
0x08048457:cmpb$0x0,(%edx,%eax,1)
0x0804845b:jne 0x8048454
请注意,在将
(%edx,%eax,1)
与0进行比较后,代码如何跳回增量eax您的意思是您正在使用x$edx
?p$edx
说了些什么?哎呀,重写这个问题。很抱歉。这个问题实际上是关于$eax的,我使用的是x$eax。它给了我这个输出:0x1:
如果$eax
的值只有1,这难道不意味着$eax
实际上不包含指向密码短语的指针吗?是的,我认为。。。但是当cmpb$0x0,(%edx,$eax,1)
时,cmpb比较的是什么?不仅%edx用作SIB字节中的基址寄存器,而且在函数开始时%eax显式设置为0,而%edx接收函数参数:0x0804847:mov 0x8(%ebp),%edx;0x080484A:mov$0x0,%eax
。
0x0804844a <+6>: mov $0x0,%eax
<...>
0x08048454 <+16>: add $0x1,%eax
0x08048457 <+19>: cmpb $0x0,(%edx,%eax,1)
0x0804845b <+23>: jne 0x8048454 <s+16>