这个程序是这样:
/>checkpass 1234567
然后checkpass会把输入的1234567转成十六进制数做相关的变换,再把当前的日期(年、月、日)做相关变换。
然后算出来一个密码(一个8位密码,是个十六进制数)
与输入的密码相比对,如果输入正确,那么通过,否则提示密码不对
linux gdb的调试过程这样:
先开一个窗口,使其停在输入密码的地方
/>checkpass 1234567
Password:
然后再另外开一个窗口,ps -ef|grep checkpass找到checkpass的pid(16690)
gdb attach 16690
跟进来
对strcmp下断
(gdb) br strcmp
Breakpoint 1 at 0xb75f5080
然后n,在之前的那个窗口里面输入个错的密码87654321
这面窗口,不停的n,一直到:
(gdb) n
Single stepping until exit from function _ZN4PePW12useLocalTimeEv,
which has no line number information.
0x0804ca8c in PePW730::GenPassword ()
(gdb) bt
#0 0x0804ca8c in PePW730::GenPassword ()
#1 0x0804a362 in PePW::CheckPW ()
#2 0x0804afe9 in checkPassword ()
#3 0x08049f0f in main ()
再n后,应该到了GenPassword返回正确口令给CheckPw的地方了
(gdb) n
Single stepping until exit from function _ZN7PePW73011GenPasswordEv,
which has no line number information.
0x0804a362 in PePW::CheckPW ()
(gdb) bt
#0 0x0804a362 in PePW::CheckPW ()
#1 0x0804afe9 in checkPassword ()
#2 0x08049f0f in main ()
//对CheckPW反汇编看下结构,
看应该断在了0x0804a362处,
(gdb) disass 0x0804a362
Dump of assembler code for function _ZN4PePW7CheckPWESs:
0x0804a342 <_ZN4PePW7CheckPWESs+0>: push %ebp
0x0804a343 <_ZN4PePW7CheckPWESs+1>: mov %esp,%ebp
0x0804a345 <_ZN4PePW7CheckPWESs+3>: sub $0x38,%esp
0x0804a348 <_ZN4PePW7CheckPWESs+6>: mov %ebx,-0xc(%ebp)
0x0804a34b <_ZN4PePW7CheckPWESs+9>: mov %esi,-0x8(%ebp)
0x0804a34e <_ZN4PePW7CheckPWESs+12>: mov %edi,-0x4(%ebp)
0x0804a351 <_ZN4PePW7CheckPWESs+15>: mov 0x8(%ebp),%eax
0x0804a354 <_ZN4PePW7CheckPWESs+18>: lea -0x14(%ebp),%edx
0x0804a357 <_ZN4PePW7CheckPWESs+21>: mov (%eax),%ecx
0x0804a359 <_ZN4PePW7CheckPWESs+23>: mov %eax,0x4(%esp)
0x0804a35d <_ZN4PePW7CheckPWESs+27>: mov %edx,(%esp)
0x0804a360 <_ZN4PePW7CheckPWESs+30>: call *(%ecx)
0x0804a362 <_ZN4PePW7CheckPWESs+32>: sub $0x4,%esp
0x0804a365 <_ZN4PePW7CheckPWESs+35>: mov -0x14(%ebp),%ecx
0x0804a368 <_ZN4PePW7CheckPWESs+38>: lea -0xc(%ecx),%ebx
0x0804a36b <_ZN4PePW7CheckPWESs+41>: mov (%ebx),%edx
0x0804a36d <_ZN4PePW7CheckPWESs+43>: mov 0xc(%ebp),%eax
0x0804a370 <_ZN4PePW7CheckPWESs+46>: mov (%eax),%eax
0x0804a372 <_ZN4PePW7CheckPWESs+48>: mov $0x0,%esi
0x0804a377 <_ZN4PePW7CheckPWESs+53>: cmp -0xc(%eax),%edx
0x0804a37a <_ZN4PePW7CheckPWESs+56>: jne 0x804a393 <_ZN4PePW7CheckPWESs+81>
0x0804a37c <_ZN4PePW7CheckPWESs+58>: mov %ecx,%esi
0x0804a37e <_ZN4PePW7CheckPWESs+60>: mov %eax,%edi
0x0804a380 <_ZN4PePW7CheckPWESs+62>: mov %edx,%ecx
0x0804a382 <_ZN4PePW7CheckPWESs+64>: cmp %edx,%edx
0x0804a384 <_ZN4PePW7CheckPWESs+66>: repz cmpsb %es:(%edi),%ds:(%esi)
0x0804a386 <_ZN4PePW7CheckPWESs+68>: seta %dl
0x0804a389 <_ZN4PePW7CheckPWESs+71>: setb %al
0x0804a38c <_ZN4PePW7CheckPWESs+74>: cmp %al,%dl
0x0804a38e <_ZN4PePW7CheckPWESs+76>: sete %al
0x0804a391 <_ZN4PePW7CheckPWESs+79>: mov %eax,%esi
0x0804a393 <_ZN4PePW7CheckPWESs+81>: cmp $0x8050540,%ebx
0x0804a399 <_ZN4PePW7CheckPWESs+87>: je 0x804a3e1 <_ZN4PePW7CheckPWESs+159>
0x0804a39b <_ZN4PePW7CheckPWESs+89>: mov $0x0,%eax
0x0804a3a0 <_ZN4PePW7CheckPWESs+94>: test %eax,%eax
0x0804a3a2 <_ZN4PePW7CheckPWESs+96>: je 0x804a3bb <_ZN4PePW7CheckPWESs+121>
0x0804a3a4 <_ZN4PePW7CheckPWESs+98>: movl $0xffffffff,0x4(%esp)
0x0804a3ac <_ZN4PePW7CheckPWESs+106>: lea 0x8(%ebx),%eax
0x0804a3af <_ZN4PePW7CheckPWESs+109>: mov %eax,(%esp)
0x0804a3b2 <_ZN4PePW7CheckPWESs+112>: call 0x8049af4 <_ZN9__gnu_cxx18__exchange_and_addEPVii@plt>
0x0804a3b7 <_ZN4PePW7CheckPWESs+117>: mov %eax,%edx
0x0804a3b9 <_ZN4PePW7CheckPWESs+119>: jmp 0x804a3c4 <_ZN4PePW7CheckPWESs+130>
0x0804a3bb <_ZN4PePW7CheckPWESs+121>: mov 0x8(%ebx),%edx
0x0804a3be <_ZN4PePW7CheckPWESs+124>: lea -0x1(%edx),%eax
0x0804a3c1 <_ZN4PePW7CheckPWESs+127>: mov %eax,0x8(%ebx)
0x0804a3c4 <_ZN4PePW7CheckPWESs+130>: test %edx,%edx
0x0804a3c6 <_ZN4PePW7CheckPWESs+132>: jg 0x804a3e1 <_ZN4PePW7CheckPWESs+159>
0x0804a3c8 <_ZN4PePW7CheckPWESs+134>: lea -0xd(%ebp),%eax
0x0804a3cb <_ZN4PePW7CheckPWESs+137>: mov %eax,0x4(%esp)
0x0804a3cf <_ZN4PePW7CheckPWESs+141>: mov %ebx,(%esp)
0x0804a3d2 <_ZN4PePW7CheckPWESs+144>: call 0x8049894 <_ZNSs4_Rep10_M_destroyERKSaIcE@plt>
0x0804a3d7 <_ZN4PePW7CheckPWESs+149>: jmp 0x804a3e1 <_ZN4PePW7CheckPWESs+159>
0x0804a3d9 <_ZN4PePW7CheckPWESs+151>: mov %eax,(%esp)
0x0804a3dc <_ZN4PePW7CheckPWESs+154>: call 0x8049ab4 <_Unwind_Resume@plt>
0x0804a3e1 <_ZN4PePW7CheckPWESs+159>: mov %esi,%eax
0x0804a3e3 <_ZN4PePW7CheckPWESs+161>: mov -0xc(%ebp),%ebx
0x0804a3e6 <_ZN4PePW7CheckPWESs+164>: mov -0x8(%ebp),%esi
0x0804a3e9 <_ZN4PePW7CheckPWESs+167>: mov -0x4(%ebp),%edi
0x0804a3ec <_ZN4PePW7CheckPWESs+170>: mov %ebp,%esp
0x0804a3ee <_ZN4PePW7CheckPWESs+172>: pop %ebp
0x0804a3ef <_ZN4PePW7CheckPWESs+173>: ret
感觉已经断在了返回正确密码处,但是正常这个返回值,应该存在eax里面吧?
用eax这个做口令试试,发现不对 ??
(gdb) info reg
eax 0xbfa0e154 -1079975596
ecx 0x0 0
edx 0x10 16
ebx 0x8053800 134559744
esp 0xbfa0e134 0xbfa0e134
ebp 0xbfa0e168 0xbfa0e168
esi 0x8053850 134559824
edi 0x8050540 134546752
eip 0x804a362 0x804a362 <PePW::CheckPW(std::string)+32>
eflags 0x282 [ SF IF ]
cs 0x73 115
ss 0x7b 123
ds 0x7b 123
es 0x7b 123
fs 0x0 0
gs 0x33 51
(gdb) x $eax
0xbfa0e154: 0x080538c4
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!