首页
社区
课程
招聘
[讨论]kanxue-tencent 第一阶段第三题
发表于: 2008-10-10 12:20 11049

[讨论]kanxue-tencent 第一阶段第三题

2008-10-10 12:20
11049

详细跟踪分析过程 如下: (有连贯性)

[详细分析文档]
  0040F621  push    offset off_42405C
  0040F626  call    __IsNonwritableInCurrentImage
  
  上列二行是在检查存放 pfmath指标所处的 Section 是不是"不可写" (大多位于 .rdata)
  这支exe被改成可写(C0000040), 这大多发生于脱壳之后, (Ex: 脱 Themida)
  导致 0040F62E jz short loc_40F63B 成立, 而未执行到浮点函式的定位/设定.
  ( 有点类似 Compiled or Linked 成无floating函数 )
  导致使用 floating函式时, 变成直接呼叫 Runtime Error Msg&Exit

  0040F618                   __cinit         proc near
  0040F618
  0040F618                   arg_0           = dword ptr  4
  0040F618
  0040F618 83 3D 5C 40 42 00+                cmp     ds:off_42405C, 0
  0040F61F 74 1A                             jz      short loc_40F63B
  0040F621 68 5C 40 42 00                    push    offset off_42405C    ;指向 *__pfmath
  0040F626 E8 65 67 00 00                    call    __IsNonwritableInCurrentImage
  0040F62B 85 C0                             test    eax, eax
  0040F62D 59                                pop     ecx
  0040F62E 74 0B                             jz      short loc_40F63B
  0040F630 FF 74 24 04                       push    [esp+arg_0]
  0040F634 FF 15 5C 40 42 00                 call    ds:off_42405C
  0040F63A 59                                pop     ecx

[描述最终出错的函数位置]
  00413E0E   call  eax

  上面正确应呼叫到 _cfltcvt_l(int, int, int, int, size_t Size, int, int)
  因上述原因, 导致直接呼叫显示错误&离开

  00413DEC 50                                push    eax
  00413DED FF 75 94                          push    [ebp+3F4h+var_460]
  00413DF0 0F BE C2                          movsx   eax, dl
  00413DF3 FF 75 E8                          push    [ebp+3F4h+var_40C]
  00413DF6 89 5D D8                          mov     [ebp+3F4h+var_41C], ebx
  00413DF9 50                                push    eax
  00413DFA FF 75 E0                          push    [ebp+3F4h+var_414]
  00413DFD 8D 45 88                          lea     eax, [ebp+3F4h+var_46C]
  00413E00 56                                push    esi
  00413E01 50                                push    eax
  00413E02 FF 35 C8 A0 42 00                 push    off_42A0C8
  00413E08 E8 3F EF FF FF                    call    __decode_pointer
  00413E0D 59                                pop     ecx
  00413E0E FF D0                             call    eax
  00413E10 8B 5D EC                          mov     ebx, [ebp+3F4h+var_408]
  00413E13 83 C4 1C                          add     esp, 1Ch
  00413E16 81 E3 80 00 00 00                 and     ebx, 80h
  

[修复方法]
  方法1: 将 .rdata Section 去掉 write 属性
         原为 C0000004 (去掉最高bit), 变为 40000004
  方法2:   将 0040F62E 的 jz , nop 掉也行

  我是采第1种方式

[找到根本出错原因]
  如上所述, 人为 或 脱壳后没修复的问题.


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 7
支持
分享
最新回复 (17)
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
2
除非你2880分提交的
2008-10-10 12:28
0
雪    币: 221
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
评分了吗,是不是还没平??
2008-10-10 12:29
0
雪    币: 1098
活跃值: (193)
能力值: (RANK:210 )
在线值:
发帖
回帖
粉丝
4
我想这是最标准的答案了,强烈支持。我们交个朋友好不好?
2008-10-10 12:31
0
雪    币: 111
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
强,我感觉是还没评分,呵,不急嘛
2008-10-10 12:32
0
雪    币: 993
活跃值: (442)
能力值: ( LV12,RANK:403 )
在线值:
发帖
回帖
粉丝
6
原来如此。学习了。
2008-10-10 12:33
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
7
......

为保险起见, 得顾到题目每个文字句要求. 又不想弄得一大团文字说明
花了2个多小时才改成这么短, 想说这下应该都看得懂了.
大家都有分了就我没分.
刚刚看到老大回覆原来是还没评分.. f-.-  骗了个精 ?
上传的附件:
2008-10-10 12:34
0
雪    币: 216
活跃值: (26)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
终于晓得答案了.........
2008-10-10 12:40
0
雪    币: 2134
活跃值: (14)
能力值: (RANK:170 )
在线值:
发帖
回帖
粉丝
9
sorry,最近比较忙,没有开始评分,一定会抓紧评分的:)不要担心,呵呵
2008-10-10 12:45
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
10
包 upx 能跑是因为 RVA 2405C 座落于 .UPX0 这个 section
而这个 section 的属性为 60000080
(原EXE是E0000080, 会被壳去掉write属性, 就是 60000080)
2008-10-10 12:49
0
雪    币: 295
活跃值: (11)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
11
这就对了吗?
这不是弹出来的OK啊

nkspark的OK不知道怎么弹的
2008-10-10 12:49
0
雪    币: 295
活跃值: (11)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
12
http://bbs.pediy.com/showthread.php?p=485326

三个月前 bithaha也给出了一种解答  

这题果然也可以google
2008-10-10 12:52
0
雪    币: 2316
活跃值: (129)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
13
学习。。。。
2008-10-10 12:57
0
雪    币: 221
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
14
OK= 确认
2008-10-10 13:52
0
雪    币: 360
活跃值: (77)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
15
坏了,没有找到根本原因,只看到snprint函数了
2008-10-10 16:35
0
雪    币: 199
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
来支持个。。。LZ的文章必看。。
2008-10-10 17:03
0
雪    币: 212
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
原来如此,学习到了,谢谢
2008-10-10 18:26
0
雪    币: 107
活跃值: (1683)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
18
用IDA找到了那个函数发现很大很大,用OD一跑就跑飞,因为循环很多,没F7去一步一跟,有时候F8一跟就跟过头,不知道高手是怎么定位那个过程里的出错的函数的。
2008-10-10 18:41
0
游客
登录 | 注册 方可回帖
返回
//