-
-
[讨论]kanxue-tencent 第一阶段第三题
-
发表于:
2008-10-10 12:20
11049
-
[讨论]kanxue-tencent 第一阶段第三题
详细跟踪分析过程 如下: (有连贯性)
[详细分析文档]
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期)