您的位置: 网界网 > 网络学院-安全 > 正文

软件漏洞分析的八大技巧汇总(1)

2014年08月06日 15:30:42 | 作者:佚名 | 来源:51CTO | 查看本文手机版

摘要:在日常分析软件漏洞时,经常需要耗费比较长的分析时间,少则几小时,多则数天,甚至更久。因此,经常总结一些分析技巧是非常有必要的,针对不同的漏洞类型采取不同的分析思路和技巧,可以有效地提高分析速度。

标签
漏洞代码
漏洞分析
软件漏洞

在日常分析软件漏洞时,经常需要耗费比较长的分析时间,少则几小时,多则数天,甚至更久。因此,经常总结一些分析技巧是非常有必要的,针对不同的漏洞类型采取不同的分析思路和技巧,可以有效地提高分析速度。对于一些被曝出来的热门0day,网上一般都会有分析文章,但一般都是“结论性分析”,也就是直接帖漏洞代码,指出哪里出错,而非“思路性分析”。如果你经常分析漏洞的话,会发现占用你分析时间的往往不是分析漏洞代码,而是定位漏洞代码。所以说,调试分析漏洞有时就是看下断点下得准不,再加上一些胡猜乱想来推测,最后才是分析漏洞代码了,如果熟悉汇编指令,这个就不是问题了。

下面是笔者就以往分析过的若干实例漏洞,总结出的一些小技巧。不过,技巧甚多,篇幅有限,此处仅列举一些比较个人常用的方法,也欢迎各位分享自己的一些分析技巧,大家共同学习探讨。

技巧一:快速定位JS代码调用的IE类成员函数

CVE-2011-0027 Microsoft Data Access组件整数溢出漏洞是Pwn2Own 2010黑客大赛中被用来攻破IE8浏览器的漏洞,其中关键的漏洞触发代码如下:

localxmlid1 = document.getElementById('xmlid1').recordset;    // 获取xml元素xmlid1的recordset,即数据库表的记录集localxmlid1.CacheSize = 0x40000358;    // 设置能够被保存的记录条数,此值最终造成整数溢出

现在我们就介绍一种快速定位上述两行代码将对应调用的IE类成员函数,首先用IDA加载漏洞文件msado15.dll,并允许加载微软符号表,然后选中“Function name”一栏,按“Alt T”快捷键弹出搜索框,输入搜索关键字“cachesize”:

软件漏洞分析技巧

通过按“Ctrl T”可继续搜索下一个,最后找到两个相关函数:

软件漏洞分析技巧

CRecordset::put_CacheSize(long *)CRocordset::get_CacheSize(long)

我们对CRecordset::put_CacheSize下断点验证下前面的猜测,用Windbg附加IE进程运行后打开poc.html,确实断在put_CacheSize,通过查看参数可以看到poc.html中设置的CacheSize值0×40000358,说明CRecordset::put_CacheSize确实是设置CacheSize值的函数:

0:005> gBreakpoint 1 hiteax=40000358 ebx=04bdcfd8 ecx=6e61d340 edx=00000000 esi=01fbf144 edi=00000000eip=6e6ac957 esp=01fbeb58 ebp=01fbf040 iopl=0         nv up ei pl zr na pe nccs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000246msado15!CRecordset::put_CacheSize:6e6ac957 8bff            mov     edi,edi0:005> dd esp01fbeb58  6e62f3ec 04bdcfd8 40000358 0000000001fbeb68  01fbf074 04bdcfd8 11000011 0000000001fbeb78  03570ae8 004ad070 00538a30 0000008801fbeb88  00470000 00000002 03570760 01fbec8401fbeb98  76fc3193 00470138 76fc316f 764736b801fbeba8  00000000 00470000 03570768 00518a7801fbebb8  004767b8 004768e4 00559258 00476db801fbebc8  76f8d74d 0051d968 00472a98 01fbedc0

我们对CRecordset::put_CacheSize下断点验证下前面的猜测,用Windbg附加IE进程运行后打开poc.html,确实断在put_CacheSize,通过查看参数可以看到poc.html中设置的CacheSize值0×40000358,说明CRecordset::put_CacheSize确实是设置CacheSize值的函数。

123456
[责任编辑:孙可 sun_ke@cnw.com.cn]