首页
社区
课程
招聘
[原创]第1阶段第3题--第2次提交
发表于: 2008-10-9 17:54 2762

[原创]第1阶段第3题--第2次提交

2008-10-9 17:54
2762
.text:00420D20 sub_420D20      proc near
.text:00420D20
.text:00420D20 var_9C          = qword ptr -9Ch
.text:00420D20 var_94          = dword ptr -94h
.text:00420D20 Text            = word ptr -90h
.text:00420D20 Dst             = byte ptr -8Eh
.text:00420D20 var_C           = dword ptr -0Ch
.text:00420D20 var_8           = qword ptr -8
.text:00420D20
.text:00420D20                 push    ebp
.text:00420D21                 mov     ebp, esp
.text:00420D23                 sub     esp, 94h
.text:00420D29                 mov     eax, dword_429DA8
.text:00420D2E                 xor     eax, ebp
.text:00420D30                 mov     [ebp+var_C], eax
.text:00420D33                 mov     [ebp+var_94], ecx
.text:00420D39                 mov     ax, ds:word_425A30
.text:00420D3F                 mov     [ebp+Text], ax
.text:00420D46                 push    7Eh             ; Size
.text:00420D48                 push    0               ; Val
.text:00420D4A                 lea     ecx, [ebp+Dst]
.text:00420D50                 push    ecx             ; Dst
.text:00420D51                 call    _memset
.text:00420D56                 add     esp, 0Ch
.text:00420D59                 fld     ds:dbl_425DC0
.text:00420D5F                 fstp    [ebp+var_8]
.text:00420D62                 fld     [ebp+var_8]
.text:00420D65                 fadd    st, st
.text:00420D67                 fstp    [ebp+var_8]
.text:00420D6A                 sub     esp, 8
.text:00420D6D                 fld     [ebp+var_8]
.text:00420D70                 fstp    [esp+9Ch+var_9C]
.text:00420D73                 push    offset aPi2F    ; "PI * 2 = %f"
.text:00420D78                 push    40h             ; Count
.text:00420D7A                 lea     edx, [ebp+Text]
.text:00420D80                 push    edx             ; Dest
.text:00420D81                 call    __snwprintf    [COLOR="Red"]; 当调用此函数时错误发生[/COLOR]
.text:00420D86                 add     esp, 14h
.text:00420D89                 push    40h             ; uType
.text:00420D8B                 push    offset Caption  ; "TestFloag"
.text:00420D90                 lea     eax, [ebp+Text]
.text:00420D96                 push    eax             ; lpText
.text:00420D97                 mov     ecx, [ebp+var_94]
.text:00420D9D                 call    sub_405C75
.text:00420DA2                 mov     ecx, [ebp+var_C]
.text:00420DA5                 xor     ecx, ebp
.text:00420DA7                 call    sub_40ECBD
.text:00420DAC                 mov     esp, ebp
.text:00420DAE                 pop     ebp
.text:00420DAF                 retn
.text:00420DAF sub_420D20      endp


原因就出在地址为0x425DC0的浮点数中
.text:00420D59                 fld     ds:dbl_425DC0

这个错误根本原因是
编译器(应该是VC8吧)的一个保护机制引起的问题
加入这个保护机制的编译器在编译时将检测从c运行库连接的代码中如果引用在只读区段的数据,那编译的程序将在启动前检查只读数据是否还是在只读区段中,如果发现所在区段不再为只读,那么将会放弃一些初始化操作,比如关于浮点数的初始化操作,这样就会引发类似与6002 floating point not loaded 这样的错误

具体看下面

.text:0040F618                 cmp     ds:off_42405C, 0
.text:0040F61F                 jz      short loc_40F63B
.text:0040F621                 push    offset off_42405C
.text:0040F626                 [COLOR="Red"]call    __IsNonwritableInCurrentImage ;检测只读区段[/COLOR]
.text:0040F62B                 test    eax, eax
.text:0040F62D                 pop     ecx
.text:0040F62E                 [COLOR="Red"]jz      short loc_40F63B[/COLOR]
.text:0040F630                 push    [esp+arg_0]
.text:0040F634                [COLOR="Red"] call    ds:off_42405C  ;_fpmath  如果不只读,跳过这个浮点函数的操作,将导致最后的6002错误[/COLOR]
.text:0040F63A                 pop     ecx


__IsNonwritableInCurrentImage:
.text:00415D90                 push    ebp
.text:00415D91                 mov     ebp, esp
.text:00415D93                 push    0FFFFFFFEh
.text:00415D95                 push    offset unk_4302B0
.text:00415D9A                 push    offset __except_handler4
.text:00415D9F                 mov     eax, large fs:0
.text:00415DA5                 push    eax
.text:00415DA6                 sub     esp, 8
.text:00415DA9                 push    ebx
.text:00415DAA                 push    esi
.text:00415DAB                 push    edi
.text:00415DAC                 mov     eax, dword_429DA8
.text:00415DB1                 xor     [ebp+var_8], eax
.text:00415DB4                 xor     eax, ebp
.text:00415DB6                 push    eax
.text:00415DB7                 lea     eax, [ebp+var_10]
.text:00415DBA                 mov     large fs:0, eax
.text:00415DC0                 mov     [ebp+var_18], esp
.text:00415DC3                 mov     [ebp+var_4], 0
.text:00415DCA                 push    offset __ImageBase
.text:00415DCF                 call    __ValidateImageBase
.text:00415DD4                 add     esp, 4
.text:00415DD7                 test    eax, eax
.text:00415DD9                 jz      short loc_415E30
.text:00415DDB                 mov     eax, [ebp+arg_0]
.text:00415DDE                 sub     eax, offset __ImageBase
.text:00415DE3                 push    eax
.text:00415DE4                 push    offset __ImageBase
.text:00415DE9                 call    __FindPESection
.text:00415DEE                 add     esp, 8
.text:00415DF1                 test    eax, eax
.text:00415DF3                 jz      short loc_415E30
[COLOR="Red"]; 检测是否只读区段
.text:00415DF5                 mov     eax, [eax+24h]  ;pSecHeader->Characteristics  
.text:00415DF8                 shr     eax, 1Fh
.text:00415DFB                 not     eax
.text:00415DFD                 and     eax, 1[/COLOR]
.text:00415E00                 mov     [ebp+var_4], 0FFFFFFFEh
.text:00415E07                 mov     ecx, [ebp+var_10]
.text:00415E0A                 mov     large fs:0, ecx
.text:00415E11                 pop     ecx
.text:00415E12                 pop     edi
.text:00415E13                 pop     esi
.text:00415E14                 pop     ebx
.text:00415E15                 mov     esp, ebp
.text:00415E17                 pop     ebp
.text:00415E18                 retn


在地址为0x425DC0的浮点数位于区段.rdata中,原属性为可读写,所以通不过检查出错

修复方法:将区段.rdata 修改为只读  或者修改上面提到的检测函数,或者外部引入_snwprintf函数均可解决问题

下面修改方法为修改.rdata 为只读

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

上传的附件:
收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 243
活跃值: (11)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
2
没 分 数 么 ?
2008-10-11 11:42
0
雪    币: 264
活跃值: (30)
能力值: ( LV12,RANK:250 )
在线值:
发帖
回帖
粉丝
3
结果提交时间 29 小时 54 分钟
结果提交时间长度 = 1794 分钟
结果提交次数 = 2
结果提交为根本原因
得分 = [(2880 - 1794)/2880]^1/5 x 1.0 x 100 - (2 -1 ) x 5 = 77.28
2008-10-14 15:08
0
游客
登录 | 注册 方可回帖
返回
//