该漏洞国内名曰“赤鬼”,九月份拿到poc的时候还没有补丁,是一个实实在在的0day,但是由于自己的懒惰,没有及时的跟踪分析,以致于当我准备看一下这个漏洞的溢出过程的时候网上已经有人分享了调试成果了,感谢http://www.freebuf.com/articles/web/5719.html的分析,这里面把溢出的过程展示在我们眼前,但是我始终对str=“\x59Mjf\u0C08\u0c0CKDogjsiIejengNEkoPDjfiJDIWUAzdfghjAAuUFGGBSIPPPUDFJKSOQJG\x48“覆盖函数返回地址的过程比较感兴趣,所以认真的跟了一下,直到找到0x77c16fa3处的rep movs指令,终于把这个过程搞明白了。 总的来说该漏洞的利用主要是3个步骤: 1.堆喷射; 2.构造数据控制函数返回时的eip 3.考虑如何绕过dep保护 本文主要对第二点比较感兴趣,详细介绍一下小弟的调试过程。 可以看0x637d464b处edi+8处的数据已经可以控制edi,然后通过edi给eax赋值,通过call dword ptr [eax+8]就得到了程序了控制权,但是edi+8是怎么被赋值控制的,没有详细介绍。阅读poc中的js(本人对js不是很了解,只能粗浅的看一个大概意思 ),如下图 可以看到这段js的大概意思就是,execCommand("selectAll ")执行完后应该是对write(”f“)的对象进行了释放,然后后面的src数据在拷贝的时候应该是覆盖了刚才write(”f“)的数据,因为scr的长度远远长于原来的数据申请的内存,造成覆盖了后面的函数返回地址。 调试环境为windows xp(sp2)+ ie8 如图 在0x637d46ae处下断点,此时dd esp后看到的栈中数据中蓝色阴影的就是覆盖后edi的值,也就是说有scr的数据覆盖的位置就在这里了,我们现在就是要找到是怎么把这段数据覆盖的。F10继续,在0x63680b53处下断点。 如图,在调用mshtml!DllGetClassObject+0xd90e9处是栈中数据如图,其中蓝色阴影处的数据就是src的数据,猜想该地址处的数据就是rep movs指令中的源数据,可见ebp-4就是函数调用时的参数,继续调试分析,在0x6366913a处下断点 如图,才是函数参数ebp-0ch处数据为栈中蓝色阴影处,此时我们只要跟踪次地址即可见到rep movs指令,继续 可见才是ebx+8处的数据就是src数据的地址,调用函数钱被压栈,此时F11进入函数 此时mov eax,dword ptr [ebp+8]执行完后eax指向了src数据开始的地方,该段指令对scr数据进行扫描,当到了数据结尾的地方取消跳转,没看懂这段数据是准备什么,但是该函数执行完ecx寄存器的值0x41,然后通过后面几次函数的调用该寄存器的值变成了0x82,此时猜想此数值是rep movs指令拷贝数据的长度,有待后面证实。 在0x77c16f70 处下断点,此时将要执行memcpy过程,此时ebp+0c就是源数据地址,ebp+8就是拷贝数据的目的地,ebp+10h存放的就是0x82,估计是拷贝的长度值。 执行shr ecx,2后ecx由0x82变成0x20,该数值就是后面拷贝数据的长度,执行了蓝色阴影处的指令后,实现了数据覆盖,此时我们在0x637d464b处下断点: 此时edi地址存放的数据就是scr里面的数据了,call dword ptr [eax+8]处正好为YMjf后面的0x0c0c0c08,这样就实现了对eip的控制。 本文只分析了如何得到eip的控制,所有插图由于多次加载调试的缘故,edi的值可能会不同,但是只要读者按照断点信息调试,就一定能够重现这个过程,小弟能力有限,在调试过程中还是有很多地方不是很清楚,忘大侠们批评指正。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)