|
为了能够让大家更好的理解这个漏洞,这里简单的描述一下这个漏洞利用原理:
Flash在处理DefineSceneAndFrameLabelData结构时候存在一个空指针引用的漏洞,malloc()分配内存失败返回一个空 指针,紧接着又会往这个指针+offset的地方写上任意的2字节的值,offset和写入的值都是可控,Mark Dowd建议大家覆盖AVM2中某个未使用指令的参数长度值,在这个例子中,这个未使用的指令是0xf8,我们可以把这个指令参数的长度覆盖成一个正整数 值,这样AVM2的校验部分,就会跳过这个长度来检测下一条指令,如果我们在每条指令前面都加上这个marker值(如上图所示意)就可以传递一串任意的 指令来达到修改栈上数据的目的。
在这里可能很多朋友会产生疑问,不用0xf8不一样能传递这些指令么,的确是能够传递,但是AVM2首先会调用alloca_probe在stack上分 配一个空间来作为AVM2的虚拟栈,也就是说所有的指令都在这个栈上进行处理从而不会干扰程序原本的栈,例如get_local指令,这个指令只有一个 offset的参数,而AVM2是这样解析这条指令,从虚拟栈的基地址 + offset * 4的地方取出一个dword值。如果这个offset所指向的地址,超过了虚拟栈的栈顶,AVM2的校验部分就会检测出这个行为并且阻止,但是Mark Dowd的这个方法就能够绕过AVM2的校验部分,直接让AVM2的解析部分来解析这段指令,这样就能达到修改虚拟栈外数据的目的了。
SHOWFRAME位于文件的偏移0×603处,此结构的主要用途是让flash立即处理DoABC结构。
DefineBits 的偏移在0×1c处,其中shellcode的偏移在0xea,整段shellcode采用双字节xor加密,xor key是0×4e7a,其中下载木马的地址为:

这段shellcode比较复杂并且夹杂了一些绕过HIPS的方法,例如Faking Stack Frames:

Hook NtCreateProcess/NtWriteVirtualMemory 绕过第三方保护软件针对这2个API的保护,修复CreateProcessInternalW函数的前面几个字节,也是针对一些保护软件所做的措施。

最后执行真正的功能,调用GetTempPathA()获取临时文件目录,调用DeleteFile删除orz.exe,并且下载新的木马文件保存为 orz.exe然后调用CreateProcessInternalA执行它,shellcode这部分已经有朋友发了详细的分析文章,大家可以参靠的那 篇。
还有一些通用性和稳定性的在这个exploit未被考虑的,比如flash的CWS功能,以及在shellcode中恢复进程的上下文等。 上一页 [1] [2] |