实验环境
推荐使用的环境 | 备注 | |
---|---|---|
操作系统 | Windows 7 | |
虚拟机 | Vmware | |
调试器 | Windbg | |
反汇编器 | IDA Pro | |
漏洞软件 | firefox |
环境准备
对于开源的软件,为了方便调试分析过程,首先是搭好一个能出现crash,并且能在源码模式进行调试,所以需要下载源码,然后本地进行编译,这样既有了符号表也有了源码,并且符号表是自己编译出来的不会出现符号表对应错误,导致分析困难。
编译Firefox17.0需要以下准备:
- Window7
- VS2010
- ed2k://|file|cn_visual_studio_2010_ultimate_x86_dvd_532347.iso|2685982720|4AE6228933DDE49D9BFA4C3467C831C2|/
- Firefox17.0源码
- http://releases.mozilla.org/pub/firefox/releases/17.0/
- MozillaBuildSetup
- http://ftp.mozilla.org/pub/mozilla.org/mozilla/libraries/win32/MozillaBuildSetup-1.7.exe
在firefox-17.0.source\firefox-17.0.source\mozilla-release\xulrunner\config目录下找到mozconfig文件,添加
ac_add_options --enable-application=browser
ac_add_options --enable-debug
ac_add_options --enable-tests
ac_add_options --enable-trace-malloc
ac_add_options --disable-webgl
移动C:\mozilla-build目录下
然后打开start-msvc10.bat。进入源码目录,输入命令make -f client.mk build。
以上是书上的步骤,不出以外的话会出意外,会提示你缺少webgl,根本原因在于mozconfig没有在环境变量中,可以将他放在源代码目录firefox-17.0.source\firefox-17.0.source\mozilla-release下。
最后就是漫长的编译过程。
最后还是编译出错。。错误提示是bad file number。
删除原先的文件夹重新解压编译,发现成功了。
动态分析
附加进程firefox.exe,然后打开poc.html。
中断在
mozjs!js::Vectorwchar_t,32,js::ContextAllocPolicy::internalAppend<wchar_t>+0x51:
5650ac01 c705000000007b000000 mov dword ptr ds:[0],7Bh ds:0023:00000000=????????
非法写入了地址为0的空间。
回溯栈定位到DoReplace函数位于jsstr.cpp:2068。
定位函数
在下断点。
进入FindReplaceLength函数。
bu 67e26514 ".if(1){.echo 'replen = ';dd ebx l1;gc}"
第一次循环replen=0x10000,sub.length=0x10000,skip=0x2,所以每一次+0xffffe。
reverse传入的参数是0,该函数会分配堆块预留空间,由于reqeust是0,所以分不够。
最后在internalAppend函数中触发非法写
静态分析
补丁对传入reverse的参数进行了一次检测。
总结
这个整数溢出漏洞崩溃点离漏洞点不算远,如果在只有PoC没有借鉴的情况下,需要向上查找可能溢出的地方,在循环较长的情况下可以通过条件断点如bu 67e26514 ".if(1){.echo 'replen = ';dd ebx l1;gc}"观察数据。
问题
在动态调试过程中,源码级调试会一行一行的走,这其中有些变量会在寄存器中,一行一行走的时候很容易忘记变量在哪个寄存器中,导致不方便找到变量的值,这里如果用IDA静态协助分析会很简单,但是有没有更好的方法呢?
文章评论