说明:
起因是这样的,在分析 WooYun: 深信服Activex控件bufferoverflow漏洞 这个漏洞的时候,发现其实还有处可导致BOF,只不过参数不一样,漏洞产生的位置也相近,
下面来过程。
1、Fuzz
前面洞主用的Fuzz工具是Dranzer,我用的是COMRadier。
没能找到其它地方下载该ActiveX,只能按 想要减肥的胖子 提供的链接下载程序并安装。
使用ComRadier的方法,很简单!搜一下便知。
Fuzz后,此处我们只关心Fuzz后Result列为Cause Exception的相关行,选中该行后,下面列表里会显示产生异常的Address,异常原因,这里我们只看,异常地址为41414141的,因为41414141意味着eip被覆盖成41414141。

2、分析异常原因
右击选中的行弹出菜单,选中Lauch in Olly,此外我设置的Immunity Debug(此外同样适用于OD),它会加载Fuzz的测试文件。
Alt+E打开Immunity Debug模块,找到OLEAUT32.dll

双击该模块,进去后按Ctrl+n键,找到DispCallFunc函数,按F2下断

F9直接跑,程序断在DispCallFunc,此时,托动鼠标向下找,找到Call Ecx 指令,按F4,执行到此处

然后 F7 单步步入

然后 按F8 一直走,走到每一个 Call的时候要注意记下,找到异常Call,要重复执行以上步骤。
直到我们找到产生异常的Call

此处我们便可以分析,汇编了,汇编可以发现
REP MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI] 这条指令把执行了拷贝数据到堆栈的操作。
3、IDA
汇编太难懂,能不能更直观点呢,IDA上场了。
我们找到这个异常发生的函数的地址此处是020099A0,看下该模块在Immunity 里的地址是02001000,那么可得offset为89A0,那么我们用IDA打开ActiveX对应的dll,用IDA的起始地址10001000+89A0,得到函数的偏移,按住g,到达100099A0处

按下F5
得到如下从汇编到C的代码
分析代码可知,原因是由于之前的漏洞是因为此处
memcpy((char *)&v19 + v12 + 32, ArgList, v13);
导致,此处v19为局部变量,v12为第5个参数的长度,v13为函数第一个参数的长度,
这里将此参数的第一个参数的值拷贝到局部变量,而没有限制,校验长度,导致BOF。
那么我们细看,该函数还有一个参数是字符串,还有一个memcpy的调用
memcpy((void *)&v26, a5, ~v10);
这里是将函数的第5个参数拷贝到v26的地址,长度为a5的长度,同样会导致BOF。
往下拉我们的ComRaider,它也Fuzz出来了。
之前的BOF,通过Heay Spray可成功弹出计算器。此处同理,我们只需要把之前漏洞作者的POC中
target.ClientLoginToCDC(buffer,1,"defaultv",1,"defaultv",1,1);
target.ClientLoginToCDC("defaultv",1,"defaultv",1,buffer,1,1);
就行。
4、本想在zone发分析的,想想,这里有个隐藏的之前没有提,怕厂商像tx那样只修改一个参数,导致白帽子多次提交同一处的不同参数导致的漏洞,这里我就提交下。