好友
阅读权限40
听众
最后登录1970-1-1
|
本帖最后由 sudami 于 2011-4-26 14:24 编辑
文章作者:sudami
信息来源:邪恶八进制信息安全团队(www.eviloctal.com)
原始出处:http://hi.baidu.com/sudami/blog/item/8136d7458950632986947340.html?timeStamp=1303796061770
2011年 - 第三届360软件大赛 第一阶段海选已经结束! 现公布第一题的标准答案,供参考!
一. 此题原理:
360SafeGame.sys注册模块加载回调通知,动态修改进程内存中PE的导入表,通过一定的算法找到合适的空间(可能会覆盖原始数据),新增导入项C:\360SafeGame.dll.当R3进程成功加载c:\360SafeGame.dll后,需后者主动和驱动交互,取出备份的原始数据做修复工作
二. 评分标准
1. 分析文档,包括BUG原因,驱动注入DLL的具体细节 +40
2. 代码完全正确,具备通用性 +60
a) 和驱动程序通信获取数据 [10]
b) 恢复被覆盖的PE块 [20]
c) 恢复IDD (Image Data Directory) [10]
d) 恢复被注入进程的部分内存块的只读权限 [5]
e) 处理托管代码(.net之流) [15]
3. 根据答题情况 0~10 分的附加分
三. 概述
360SafeGame.sys注册一个模块加载回调,监控到notepad.exe / iexplore.exe 启动时,会动态的修改内存中的PE结构.
在其资源节找一块足够存放新导入表的地方,构造一份新的导入表,其中包含c:\360SafeGame.dll这个模块; 同时驱动中
会将原始的数据备份. 这样notepad.exe / iexplore.exe就会按照这份新构造的导入表来加载DLL,完成进程的初始化工作.
因为新构造的导入表将模块c:\360SafeGame.dll的加载顺序放在第一的位置,所以一旦c:\360SafeGame.dll被加载,进入
其DllMain函数,我们需要主动和360SafeGame.sys通信,取得备份的原始数据,来恢复可能被覆盖的资源节. 当我们复原了
PE后,进程的初始化工作才能正常的完成. 那为什么IE可以被有BUG的360SafeGame.dll正常注入,而notepad.exe就会自动退出呢?
因为IE进程的资源节很大,有很多空隙; 我们构造的新导入表没有覆盖掉原始的资源节,而是放在了其空隙中; 但notepad.exe的PE
内存结构是非常紧凑的,没有那么大的空隙用来存放新构造的导入表,所以驱动在修改PE结构时,就已经破坏了notepad.exe的资源节.
用windbg启动notepad.exe,挂上异常退出的断点,观察栈上的调用函数序列,IDA打开notepad.exe,定位到出问题的函数位置,会发现
是其内部在找不到icon资源时会exitprocess,自动退出.
四. 衍生问题
多数选手仅分析了notepad退出的原因,从而读磁盘原始的EXE文件,进行覆盖修复;细心的选手会发现启动IE8.0界面无法显示,那么再尝试把任意exe重命名为notepad.exe,替换至C:\WINDOWS\notepad.exe启动,都有异常.也就是说此BUG任何进程都存在!这样不就是单一问题,不能通过硬编码来完成.
于是部分选手开始分析360SafeGame.sys,其中有部分的原始数据可供修复.这里可分为几类:
a. 调试后硬编码驱动的固定地址,通过非正规方式读取驱动的备份数据,修复进程
b. 调试后发现驱动可通过Ioctl获取数据,通过正规方式修复进程
c. 小一部分选手没有浅尝辄止,耐心细心的深入分析驱动,发现a,b那样只做了1/4的修复工作,于是顺带修复了IDD
d. 个别选手发现,经过a,b,c的修复后运行.net程序依然出错.结合驱动中有处理mscoree.dll / msvcm80.dll / msvcm90.dll的逻辑,
再次分析,终于成功修复了托管代码,可使.net程序正常运行.
e. 分析文档的得分占有一定的比例,有的同学简单写了点,有的同学写的非常认真,跟毕业论文一样!这可以看出做事的态度.
很少有童鞋注意到评分标准中的e,d两条;
对于e:恢复被注入进程的部分内存块的只读权限,可用windbg观察PE被覆盖处的内存块属性
对于f:处理托管代码(.net之流) ,只有"古河","KiDebug"关注过并写了修复代码.
此题本质是分析BUG不要只看一个点,要看到一个面;有人认为只要notepad.exe能启动,BUG就算修复,那为什么不可以继续深入的测试分析一下,找到问题的缘由呢? 对notepad.exe是资源节被覆盖,对其他程序可能就不是资源节被损坏,难道要硬编码一个一个的分析,读取不同文件的不同数据段进行修复么? 自然驱动备份了数据,从驱动取就行了.驱动的ioctl存在提权漏洞,同样可以写到分析文档里面.反正这些等等等的细节都是可以拿来说说的.
各位童鞋不管是不屑于做也好,懒得分析也罢,但只要参赛了,就要有一个认真的态度.10天的时间,如果真有心做,这第一题也花费不了多少精力.但好多选手有功底有实力,却还是敷衍了事,导致得分不多,实在可惜;而KiDbug同学的文档是所有参赛选手中写的最好的(包含于附件).
五. 附件
附件中包含第一题的标准答案/测试.net的程序/分析文档借用KiDebug同学.
谢谢各位参赛选手!重在参与,致敬!
|
|