实验环境
推荐使用的环境 | 备注 | |
---|---|---|
操作系统 | Windows 7 SP1 | |
虚拟机 | Vmware | |
调试器 | Windbg | |
反汇编器 | IDA Pro | |
漏洞软件 | Firefox | 3.6.16 |
动态分析
又是火狐。。。之前做过一次符号表从服务器上下载的不对,需要自己编译,真不想再编译了,有需要的可以参考CVE-2013-0750的环境搭建方法。
这里我就动态看一下堆栈然后静态分析了。而且还有个疑惑,我Win7虚拟机上的Windbg现在开启会大量的时间卡在如下情况,不知道啥原因。。
push eax压入this指针,call [ecx+18h]很容易想到是虚函数调用。
这里书中使用u +函数名+偏移打断点
符号表不对,所以我这边显示不出来上述内容。
从最开始的栈回溯中可以发现触发漏洞的类是xul!nxObjectLoadingContent,发现其中有onChannelRedirect方法,所以可以对其也下一个断点。
这里我通过偏移地址下好了断点,当然符号还是不对。
静态分析
第一个断点
在aNewChannel的值赋给了mChannel后,该函数执行完,aNewChannel的内存会被firefox的垃圾回收机制回收(这里好奇怪,为什么我返回了但是aNewChannel占的内存没有被free啊,[又想了想应该用heap -p -a 更准确点,address可能看的是堆是否被free,而不是堆块free]。。。以下为Chatgpt解释。这么一想,之前双重释放漏洞更好理解为什么只有在堆块合并操作后,再次释放才会有问题了,以后得再好好看一下堆管理机制啊)
然后会在nsresult
nsObjectLoadingContent::LoadObject的时候引用到被释放了mChannel对象。
漏洞利用
漏洞利用就是首先申请一块同样大小的内存,将虚表指针改为自己想要的地址。这里是0x0c0c001c
再堆喷射让shellcode在0x0c0c001c+18h处(因为call的是ecx+18h),最后就可以漏洞利用了。
文章评论