首页
论坛
专栏
课程

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

2008-10-10 12:20 9092

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

2008-10-10 12:20
9092
详细跟踪分析过程 如下: (有连贯性)

[详细分析文档]
  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种方式

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

[公告]安全服务和外包项目请将项目需求发到看雪企服平台:https://qifu.kanxue.com

上传的附件:
最新回复 (17)
forgot 26 2008-10-10 12:28
2
0
除非你2880分提交的
windsun 1 2008-10-10 12:29
3
0
评分了吗,是不是还没平??
zhuliang 5 2008-10-10 12:31
4
0
我想这是最标准的答案了,强烈支持。我们交个朋友好不好?
Aleaxander 1 2008-10-10 12:32
5
0
强,我感觉是还没评分,呵,不急嘛
Loka 2 2008-10-10 12:33
6
0
原来如此。学习了。
sessiondiy 4 2008-10-10 12:34
7
0
......

为保险起见, 得顾到题目每个文字句要求. 又不想弄得一大团文字说明
花了2个多小时才改成这么短, 想说这下应该都看得懂了.
大家都有分了就我没分.
刚刚看到老大回覆原来是还没评分.. f-.-  骗了个精 ?
上传的附件:
sskey 1 2008-10-10 12:40
8
0
终于晓得答案了.........
Aker 4 2008-10-10 12:45
9
0
sorry,最近比较忙,没有开始评分,一定会抓紧评分的:)不要担心,呵呵
sessiondiy 4 2008-10-10 12:49
10
0
包 upx 能跑是因为 RVA 2405C 座落于 .UPX0 这个 section
而这个 section 的属性为 60000080
(原EXE是E0000080, 会被壳去掉write属性, 就是 60000080)
findlakes 1 2008-10-10 12:49
11
0
这就对了吗?
这不是弹出来的OK啊

nkspark的OK不知道怎么弹的
findlakes 1 2008-10-10 12:52
12
0
http://bbs.pediy.com/showthread.php?p=485326

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

这题果然也可以google
shellwolf 10 2008-10-10 12:57
13
0
学习。。。。
windsun 1 2008-10-10 13:52
14
0
OK= 确认
popeylj 6 2008-10-10 16:35
15
0
坏了,没有找到根本原因,只看到snprint函数了
七号 2008-10-10 17:03
16
0
来支持个。。。LZ的文章必看。。
edigar 2008-10-10 18:26
17
0
原来如此,学习到了,谢谢
frozenrain 2008-10-10 18:41
18
0
用IDA找到了那个函数发现很大很大,用OD一跑就跑飞,因为循环很多,没F7去一步一跟,有时候F8一跟就跟过头,不知道高手是怎么定位那个过程里的出错的函数的。
游客
登录 | 注册 方可回帖
返回