首页
社区
课程
招聘
[求助]linux gdb反向调试的问题
发表于: 2015-8-26 09:58 4218

[求助]linux gdb反向调试的问题

2015-8-26 09:58
4218
这个程序是这样:
/>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

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 96
活跃值: (60)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
最后没在执行这句的时候
0x0804a368 <_ZN4PePW7CheckPWESs+38>:    lea    -0xc(%ecx),%ebx
看到ecx的里面放的是口令了
但具体之前函数返回的口令放在哪儿了,还是不知道了
Anyway,这个破解算是成功了
2015-8-26 15:35
0
游客
登录 | 注册 方可回帖
返回
//