首页
社区
课程
招聘
[原创][第一阶段◇第三题答案]看雪论坛.腾讯公司2008软件安全竞赛
发表于: 2008-10-8 14:48 2884

[原创][第一阶段◇第三题答案]看雪论坛.腾讯公司2008软件安全竞赛

2008-10-8 14:48
2884
收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 503
活跃值: (80)
能力值: (RANK:280 )
在线值:
发帖
回帖
粉丝
2
第三题的问题出在420D81的函数__snwprintf上,虽然参数传递没有问题,但是因为编译器优化的原因,该函数对浮点数转换的处理没有被编译进该exe,如果单独patch补足所有的浮点数处理代码太繁琐,因此写了一个动态库pediydll.dll,输出一个naked函数"my_snwprintf",该函数只有一条指令
jmp _snwprintf

直接跳转到完整的_snwprintf处理函数

然后修改420D81处的代码跳转至421D00


.text:00420D81 E9 7A 0F 00 00 jmp loc_421D00


并在421D00处实现如下代码加载pediydll.dll并且调用完整版本的_snwprintf函数,随后跳回到
420D86返回原始流程


.text:00421D00 68 20 1D 42 00 push offset aPediydll_dll ; "pediydll.dll"
.text:00421D05 FF 15 C4 21 42 00 call ds:LoadLibraryA
.text:00421D0B 68 30 1D 42 00 push offset aMy_snwprintf ; "my_snwprintf"
.text:00421D10 50 push eax ; hModule
.text:00421D11 FF 15 50 22 42 00 call ds:GetProcAddress
.text:00421D17 FF D0 call eax ;
.text:00421D19 E9 68 F0 FF FF jmp loc_420D86
.text:00421D19 ; END OF FUNCTION CHUNK FOR sub_420D20
.text:00421D19 ; ---------------------------------------------------------------------------
.text:00421D1E 00 00 align 10h
.text:00421D20 70 65 64 69 79 64+aPediydll_dll db 'pediydll.dll',0
.text:00421D2D 00 00 00 align 10h
.text:00421D30 6D 79 5F 73 6E 77+aMy_snwprintf db 'my_snwprintf',0

2008-10-8 15:04
0
雪    币: 2134
活跃值: (14)
能力值: (RANK:170 )
在线值:
发帖
回帖
粉丝
3
出错地点已经找到,但是原因不正确:)
2008-10-8 15:07
0
雪    币: 503
活跃值: (80)
能力值: (RANK:280 )
在线值:
发帖
回帖
粉丝
4
重新上传,之前误解msdn了
不是编译器优化没有编译进去,而是缺省没有调用而已
上传的附件:
2008-10-8 16:30
0
雪    币: 503
活跃值: (80)
能力值: (RANK:280 )
在线值:
发帖
回帖
粉丝
5
程序启动阶段___tmainCRTStartup函数中调用了__cinit函数,在这个函数的第一个判断是校验浮点运算初始化函数指针所处的section是否为可写,如果可写的话就跳过浮点运算初始化函数,因此缺省情况下函数_snwprintf会直接显示出错信息并退出,如果该section,也就是.rdata不可写,代码会调用浮点运算初始化函数,缺省的指向出错函数的指针会被替换成正常处理函数,因此可以正常运算并显示PI * 2 = 6.283180

可惜之前误解msdn还以为是编译器没有编译进去这部分代码,原来只不过是没调用而已,汗一个
2008-10-8 16:37
0
雪    币: 503
活跃值: (80)
能力值: (RANK:280 )
在线值:
发帖
回帖
粉丝
6
忘记说解决办法了,就是修改文件地址0x22F处的.rdata section的特征符,将该数值从0xC0改成0x40即可
2008-10-8 16:39
0
雪    币: 264
活跃值: (30)
能力值: ( LV12,RANK:250 )
在线值:
发帖
回帖
粉丝
7
结果提交时间 4 小时 30 分钟
结果提交时间长度 = 270 分钟
结果提交次数 = 2
结果提交为根本原因
得分 = [(2880 - 270)/2880]^1/5 x 1.0 x 100 - (2 -1 ) x 5 = 93.05
2008-10-14 15:57
0
游客
登录 | 注册 方可回帖
返回
//