首页
论坛
课程
招聘
[求助]逆向新人,卡在调试第一步,windbg附加进程,进程直接退出
2023-3-12 17:15 3025

[求助]逆向新人,卡在调试第一步,windbg附加进程,进程直接退出

2023-3-12 17:15
3025

在xp系统上,运行调试程序,使用windbg附加进程,提示:
(fd4.d10): Break instruction exception - code 80000003 (first chance)
按k提示:
0fffffc8 7c970010 ntdll!DbgBreakPoint

 

应该是在建立调试连接,兴奋的按下g,进程直接结束,没有任何提示。

 

求大神给给破解思路。至少可以断点到程序结束的地方,看看程序为啥结束,然后再一步一步破解吧~

 

阴差阳错,几个伙伴玩起了十多年前小时候的游戏mxd,而后又意外的了解到了逆向,产生了浓厚的兴趣,想拿这个游戏当作逆向入门的第一课,结果卡在了附加程序第一步。
中间草草看过了《逆向工程核心原理》《游戏外挂攻防艺术》《加密与解密》《软件调试》,还是没有找到破解的方向,逆向对新人真的太不友好了~~


二进制系列之Pwn篇

收藏
点赞0
打赏
分享
最新回复 (9)
雪    币: 0
活跃值: 活跃值 (81)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
happyRR 活跃值 2023-3-14 21:46
2
0
今日进展 
尝试了好多关闭进程的函数,最终找到ntdll!LdrShutDownProcess。
断点断住了,程序窗口关闭了但是任务管理器进程好像还在。

下一步,找到调用ntdll!LdrShutDownProcess的原因
雪    币: 0
活跃值: 活跃值 (81)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
happyRR 活跃值 2023-3-15 21:09
3
0

0:046> g

Breakpoint 0 hit

eax=00000000 ebx=00000000 ecx=0179fe9c edx=7c92e4f4 esi=7c92de50 edi=00000000

eip=7c943bb8 esp=0179fea8 ebp=0179ff98 iopl=0         nv up ei ng nz na pe nc

cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000286


当前断点EIP=7c943bb8,是ntdll!LdrShutdownProcess的第一行


0:002> k

ChildEBP RetAddr  

0179fea4 0135be96 ntdll!LdrShutdownProcess

WARNING: Frame IP not in any known module. Following frames may be wrong.

0179ffb4 7c80b713 0x135be96

0179ffe0 7c80b71f kernel32!BaseThreadStart+0x37

0179ffe4 00000000 kernel32!BaseThreadStart+0x43



根据堆栈往上回溯,发现7c80b713处是kernel32!BaseThreadStart函数

kernel32!BaseThreadStart:

7c80b6dc 6a10            push    10h

7c80b6de 6820b7807c      push    offset kernel32!`string'+0x88 (7c80b720)

7c80b6e3 e8ee6dffff      call    kernel32!_SEH_prolog (7c8024d6)

7c80b6e8 8365fc00        and     dword ptr [ebp-4],0

7c80b6ec 64a118000000    mov     eax,dword ptr fs:[00000018h]

7c80b6f2 8945e0          mov     dword ptr [ebp-20h],eax

7c80b6f5 817810001e0000  cmp     dword ptr [eax+10h],1E00h

7c80b6fc 750f            jne     kernel32!BaseThreadStart+0x31 (7c80b70d)

7c80b6fe 803d0850887c00  cmp     byte ptr [kernel32!BaseRunningInServerProcess (7c885008)],0

7c80b705 7506            jne     kernel32!BaseThreadStart+0x31 (7c80b70d)

7c80b707 ff15f412807c    call    dword ptr [kernel32!_imp__CsrNewThread (7c8012f4)]

7c80b70d ff750c          push    dword ptr [ebp+0Ch]

7c80b710 ff5508          call    dword ptr [ebp+8]

7c80b713 50              push    eax

7c80b714 e8cf090000      call    kernel32!ExitThread (7c80c0e8)


最后于 2023-3-15 21:12 被happyRR编辑 ,原因:
雪    币: 0
活跃值: 活跃值 (81)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
happyRR 活跃值 2023-3-16 20:31
4
0
昨天走了一点弯路,追溯到了最外面。其实前面提示了
WARNING: Frame IP not in any known module. Following frames may be wrong.
表示堆栈回溯已经不准确了。

回看更早一点的位置0x135be96,这里是调用kernel32!_imp__NtTerminateProcess的地方。
断点到函数开始的地方0135be54,发现并没有常见的push ebp;move ebp, esp;所以这里的堆栈回溯应该从esp开始。

0:040> bp 0135be54 
0:040> g
Breakpoint 0 hit
eax=00000000 ebx=00000000 ecx=00000000 edx=00000000 esi=00000000 edi=00c21280
eip=0135be54 esp=0179ff9c ebp=0179ffac iopl=0         nv up ei pl zr na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000246
0135be54 68d0000000      push    0D0h

查看esp位置的值,存的是0135bf0e,应该是上一个函数调用的地址。
查看反汇编窗口,果然上一行0135bf09调用了0135be54。
0:002> dd 0179ff9c
0179ff9c  0135bf0e 00000000 77e8f3b0 ffffffff

断点函数开始的位置0135befc,查看堆栈,发现ebp,esp都看不到返回地址。又卡住了
0135befc 55              push    ebp
0135befd 8bec            mov     ebp,esp
0135beff 6aff            push    0FFFFFFFFh
0135bf01 68b0f3e877      push    offset RPCRT4!SIMPLE_DICT2::Next+0x38 (77e8f3b0)
0135bf06 ff7508          push    dword ptr [ebp+8]
0135bf09 e846ffffff      call    0135be54
0135bf0e e99acf0100      jmp     01378ead

0:040> bp 0135befc 
0:040> g
Breakpoint 0 hit
eax=00000000 ebx=00000000 ecx=00000000 edx=00000000 esi=00000000 edi=00c21280
eip=0135befc esp=0179ffb0 ebp=f97d9014 iopl=0         nv up ei pl zr na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000246
0135befc 55              push    ebp
0:002> k
ChildEBP RetAddr  
WARNING: Frame IP not in any known module. Following frames may be wrong.
0179ffac 00000000 0x135befc
0:002> dd 0179ffb0
0179ffb0  00000000 00000000 7c80b713 00c70f5e
雪    币: 176
活跃值: 活跃值 (234)
能力值: ( LV9,RANK:195 )
在线值:
发帖
回帖
粉丝
palkiver 活跃值 2023-3-17 15:05
5
0
有驱动的游戏?小伙子注意安全啊
雪    币: 0
活跃值: 活跃值 (81)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
happyRR 活跃值 2023-3-18 11:48
6
0
palkiver 有驱动的游戏?小伙子注意安全啊
应该是有驱动。只讨论技术也会有问题吗?

很老的游戏,都没有运营了。我自己有服务端的代码,部署了一下。然后找了一个客户端
雪    币: 0
活跃值: 活跃值 (81)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
happyRR 活跃值 2023-3-18 11:52
7
0

0:040> bp 0135befc

0:040> g
Breakpoint 0 hit
eax=00000000 ebx=00000000 ecx=00000000 edx=00000000 esi=00000000 edi=00c21280
eip=0135befc esp=0179ffb0 ebp=f97d9014 iopl=0         nv up ei pl zr na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000246
0135befc 55              push    ebp



卡在这一步了,ebp=f97d9014一个很奇怪的数字,esp=0179ffb0地址处存的值也是0。
用ida打开想看一下交叉引用,也看不到~~

怎样才能知道上一步是哪里,现在断点到了0135befc,但是不知道怎么运行到这一步的。

最后于 2023-3-18 11:53 被happyRR编辑 ,原因:
雪    币: 0
活跃值: 活跃值 (81)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
happyRR 活跃值 2023-3-18 22:30
8
0

搜了一下有没有办法记录每一个eip,好像不行。想着单步运行每一步把eip打印出来,好像效率太低也不行。

尝试给地址esp=0179ffb0下硬件断点,看谁访问或者修改了这个地址。
bg r1 0179ffb0,找到了eip=00c717dd,这里push 0把0179ffb0更新成了0。
Breakpoint 0 hit
eax=00000000 ebx=00c10023 ecx=01341813 edx=7c92e4f4 esi=00000000 edi=00000000
eip=00c717dd esp=0179ffb8 ebp=f97d9014 iopl=0         nv up ei pl zr na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000246

然后尝试用脚本打印出每一个分支处的寄存器的值,想看能不能一直找到eip=0135befc处。

.for (r $t0=1; @$t0<1000; r $t0=@$t0+1) {th; .printf "eip=%N,eax=%N,ebx=%N,ecx=%N,edx=%N,edi=%N",eip,eax,ebx,ecx,edx,edi;.echo}

发现eip一直在循环
eip=00c6420d
eip=00c641e5
eip=00c641ee
eip=00c64206
eip=00c6c105
eip=00c6c109
eip=00c6c161
eip=00c6c0c7
eip=00c6c0dd
eip=00c6c0e6
eip=00c6c0f4
eip=00c641e5
eip=00c641ee
eip=00c6420d
eip=00c641e5
eip=00c641ee
eip=00c64206
eip=00c6c105
eip=00c6c109
eip=00c6c161
eip=00c6c0c7
eip=00c6c0dd
eip=00c6c0e6
eip=00c6c0f4
eip=00c641e5
eip=00c641ee

并且只有ebx不断在增加
Breakpoint 2 hit
eip=00C6C161,eax=01345653,ebx=01345687,ecx=00C1E36A,edx=FCB148D8,edi=01345687
Breakpoint 2 hit
eip=00C6C161,eax=01345653,ebx=0134569F,ecx=00C1E36A,edx=FCB148D8,edi=0134569F
Breakpoint 2 hit
eip=00C6C161,eax=01345653,ebx=013456B0,ecx=00C1E36A,edx=FCB148D8,edi=013456B0

最后于 2023-3-18 22:31 被happyRR编辑 ,原因:
雪    币: 0
活跃值: 活跃值 (81)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
happyRR 活跃值 2023-3-18 22:36
9
0
代码一直循环,且ebx的值不断增加,看上去是代码的地址。有点像是再解密代码区域。
找到循环的某一处地址00c6c161,以及最后我想追溯的地址0135befc ,下好断点
 1 e 0135befc     0001 (0001)  0:**** 
 2 e 00c6c161     0001 (0001)  0:****

继续用脚本运行
.do {g; .printf "ebx=%N",ebx;.echo} (@eip!=00c6c161)

代码终于在0135befc停下来了。
Breakpoint 2 hit
ebx=00007AD0
Breakpoint 2 hit
ebx=00003053
Breakpoint 1 hit
ebx=00000000

不过我是用windbg附加的process,按理说不应该再有解码操作。所以我这里怀疑是不是代码检测到了调试器,终止程序之前,有反调试再加密代码区域。。。
雪    币: 0
活跃值: 活跃值 (81)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
happyRR 活跃值 2023-3-19 12:33
10
0
Breakpoint 2 hit
ebx=00003053
Breakpoint 1 hit
ebx=00000000

从倒数第二个断点开始追踪,又经过了一些循环。反正就就是尽量记住每一个分支处的eip,并且同时尽量加速(断点太多速度会很慢),最后终于找到了eip= 0135befc的上一行。00C21387

0:002> .for (r $t0=1; @$t0<100; r $t0=@$t0+1) {th; .printf "eip=%N,eax=%N,ebx=%N,ecx=%N,edx=%N,edi=%N",eip,eax,ebx,ecx,edx,edi;.echo}

eip=00C21387,eax=00000000,ebx=00000000,ecx=00000000,edx=00000000,edi=00C21280
Breakpoint 1 hit

eip=00C21387是一个ret指令,此时esp=0179fea8,存的值0135befc;运行完return后,eip变成了0135befc;
实际上很早的时候已经把0135befc存在了栈地址0179fea8处。
游客
登录 | 注册 方可回帖
返回