flash漏洞调试技巧

本周中心抓到一个在野的flash 0day(相关信息见此链接),于是又捡起了一年多的flash 漏洞的相关知识,遂总结一下。

普通的trace

调试flasher样本一般建议使用调试版的flash player,在调试版本下可以输出swf文件运行时的相关日志,便于进行相关的分析,安装之后会在家目录(C:\User\<your name>mm.cfg)生成该文件(早期的flash调试版本不会生成该文件,需要手动生成)。

文件中包含以下配置选项,手动生成的话红色框中的选项为必选项,用于告诉flash生成错误日志及trace日志(对应的日志文件保存在C:\Users\<your name>\AppData\Roaming\Macromedia\Flash Player\Logs目录下)。

通过FFdec,可以直接往flash中打trace补丁,用于输出对应的参数,变量。


findpropstrict Qname(PackageNamespace(""),"trace")

pushstring "Hello World!"

callpropvoid Qname(PackageNamespace(""),"trace") 1

Jit函数监控

但是大多数漏洞调试中,trace不够强大,这就需要通过调试器了,因为flash里的脚本在执行的时候会转为jit,因此调试非常不便,这也是早期flash很难搞的一个问题,但是可以通过以下断点解决。


29.r0.140  flash.ocx

.dvalloc /b 0x79990000 30;eb 0x79990000 5e;ew 0x79990001 c3

bp Flash32_29_0_0_140 + 0x8D03D2 ".printf \"the method_name is: %ma\\n\",poi(eax+8);.if(poi(esi+20)=0xFFFFFFFF){bp poi(esi+4}.else{gc}"

bp Flash32_29_0_0_140 + 0x8BA425 ".printf \"the method_index is:%p the method_info_pointer is:%p the jit code is:%p the method_body is:%p\\n\",poi(esi+20),esi,poi(esi+4),poi(esi+24);r ecx = esi;r $t0 = poi(esp);ed esp eip+1;r esp = esp - 4;ed esp @$t0;r esp = esp -4;ed esp 0x79990000;r eip = Flash32_29_0_0_140 + 0x8D03AF;g"

原理

fun_verifyMethod,该函数是flash引擎中用于对jit函数校验的地方,该函数返回的esi其实是一个jit method的对象,里面包含了具体生成的jit函数的index,method ,jit code等属性,其中index是引擎内部用于识别jit函数的标记(就一数字),jit code标记了生成的对应地址,但是对应正常人而言index这种数字明显没有意义,我们需要具体的函数名,这就引出之后的fun_getMethodName函数。

fun_getMethodName,其ecx接受一个method的对象(即fun_verifyMethod返回的对象),结果会返回一个具体函数的函数名,但是该函数默认在flash运行时不会调用,因此需要在fun_verifyMethod调用后手动调用一下fun_getMethodName,既可以获得对应的函数名,此时结合fun_verifyMethod返回的地址,就能实现正常的调试。

使用

脚本中一共三条命令,第一条用于生成一段内存,主要用于在fun_verifyMethod后,改变程序流程去执行fun_getMethodName(你可以理解为hook),之后分别是这两个函数的断点。


.dvalloc /b 0x79990000 30;eb 0x79990000 5e;ew 0x79990001 c3

bp Flash32_29_0_0_140 + 0x8D03D2 ".printf \"the method_name is: %ma\\n\",poi(eax+8);.if(poi(esi+20)=0xFFFFFFFF){bp poi(esi+4}.else{gc}"

bp Flash32_29_0_0_140 + 0x8BA425 ".printf \"the method_index is:%p the method_info_pointer is:%p the jit code is:%p the method_body is:%p\\n\",poi(esi+20),esi,poi(esi+4),poi(esi+24);r ecx = esi;r $t0 = poi(esp);ed esp eip+1;r esp = esp - 4;ed esp @$t0;r esp = esp -4;ed esp 0x79990000;r eip = Flash32_29_0_0_140 + 0x8D03AF;g"

调试的时候,下这两个断点,运行之后生成整个jit函数的信息,记下来,每个函数index很重要。

运行第二遍就可以正常调试了,此时只要将红字换成对应的函数index即可(对同一个swf,index是固定的),此时运行,即可在指定jit函数生成的时候断下。


bp Flash32_29_0_0_140 + 0x8D03D2 ".printf \"the method_name is: %ma\\n\",poi(eax+8);.if(poi(esi+20)=0xFFFFFFFF){bp poi(esi+4}.else{gc}"

此时针对replace的jit code地址下断点,及可以断下。

通用性

替换,该脚本是针对29.r0.140  flash.ocx,之后需要使用其他版本的时候需要改对应的地址,这就涉及到如何快速获取对应的fun_getMethodName和fun_verifyMethod函数。

fun_getMethodName,ida里找cinit字符,对应引用的函数。

引用函数如下。

再向上一层就是了。

fun_verifyMethod函数,搜JIT failed字符。

对应的引用。

对该函数的引用,第一个就是,不是就找找反正不多。

需要修改以下三个值(蓝色部分根据你要跟的函数index自己替换),

第一个红色地址为fun_getMethodName返回的ret地址。

第二个红色地址为fun_verifyMethod返回前的pop esi的地址。

第三个红色地址为fun_getMethodName的起始地址减一(为啥减一是为了windbg中断点hook的需要)。


.dvalloc /b 0x79990000 30;eb 0x79990000 5e;ew 0x79990001 c3

bp Flash32_29_0_0_140 + 0x8D03D2 ".printf \"the method_name is: %ma\\n\",poi(eax+8);.if(poi(esi+20)=0xFFFFFFFF){bp poi(esi+4}.else{gc}"

bp Flash32_29_0_0_140 + 0x8BA425 ".printf \"the method_index is:%p the method_info_pointer is:%p the jit code is:%p the method_body is:%p\\n\",poi(esi+20),esi,poi(esi+4),poi(esi+24);r ecx = esi;r $t0 = poi(esp);ed esp eip+1;r esp = esp - 4;ed esp @$t0;r esp = esp -4;ed esp 0x79990000;r eip = Flash32_29_0_0_140 + 0x8D03AF;g"

转载请注明出处

原文地址:https://www.cnblogs.com/goabout2/p/9158051.html

时间: 2024-10-29 06:08:35

flash漏洞调试技巧的相关文章

apt28组织新的flash漏洞利用包dealerschoice分析

17号paloalto发布了文章dealerschoice-sofacys-flash-player-exploit-platform,文中提到apt28正在编写adobe flash player的利用工具包,遂将样本下下来分析了一番. 和之前很多的flash漏洞利用不同,这次apt28将自身的漏洞利用工具作为ole的一部分捆绑到rtf文件中,运行结果如下,可以看到运行之后,直接显示的是一个word文档,内容是关于俄罗斯的,看来这次是要搞老毛子咯...... Rtf文件处理 直接通过offic

C语言内存调试技巧—C语言最大难点揭秘

本文将带您了解一些良好的和内存相关的编码实践,以将内存错误保持在控制范围内.内存错误是 C 和 C++ 编程的祸根:它们很普遍,认识其严重性已有二十多年,但始终没有彻底解决,它们可能严重影响应用程序,并且很少有开发团队对其制定明确的管理计划.但好消息是,它们并不怎么神秘.引言C 和 C++ 程序中的内存错误非常有害:它们很常见,并且可能导致严重的后果.来自计算机应急响应小组(请参见参考资料)和供应商的许多最严重的安全公告都是由简单的内存错误造成的.自从 70 年代末期以来,C 程序员就一直讨论此

IE漏洞调试之CVE-2013-3893

前言 Windows平台的漏洞挖掘和安全研究中,IE始终是绕不开的话题.IE漏洞就跟adobe系列一样经典,是学习exploit.shellcode的绝佳途径. 在IE漏洞中,UAF即Use-After-Free是最为经典的一类.UAF可以这样简单理解:A先后调用B.C.D三个子函数,B会把A的某个资源释放掉:而D由于判断不严谨即使在B把A的资源释放后依然去引用它,比如某个指针,这时D引用了很危险的悬空指针:C是个什么角色呢?我们可以通过B分配数据.所以利用方法来了:构造奇葩的数据,让A调用B,

Chrome 中的 JavaScript 断点设置和调试技巧

你是怎么调试 JavaScript 程序的?最原始的方法是用 alert() 在页面上打印内容,稍微改进一点的方法是用 console.log() 在 JavaScript 控制台上输出内容.嗯~,用这两种土办法确实解决了很多小型 JavaScript 脚本的调试问题.不过放着 Chrome 中功能越发强大的开发者工具不用实在太可惜了.本文主要介绍其中的 JavaScript 断点设置和调试功能,也就是其中的 Sources Panel(以前叫 Scripts).如果你精通 Eclipse 中的

一探前端开发中的JS调试技巧

前言:调试技巧,在任何一项技术研发中都可谓是必不可少的技能.掌握各种调试技巧,必定能在工作中起到事半功倍的效果.譬如,快速定位问题.降低故障概率.帮助分析逻辑错误等等.而在互联网前端开发越来越重要的今天,如何在前端开发中降低开发成本,提升工作效率,掌握前端开发调试技巧尤为重要. 本文将一一讲解各种前端JS调试技巧,也许你已经熟练掌握,那让我们一起来温习,也许有你没见过的方法,不妨一起来学习,也许你尚不知如何调试,赶紧趁此机会填补空白. 骨灰级调试大师Alert 那还是互联网刚刚起步的时代,网页前

js调试技巧 Firefox调试技巧汇总

Firebug入门指南        :  http://www.ruanyifeng.com/blog/2008/06/firebug_tutorial.html Firebug控制台详解: http://www.cnblogs.com/see7di/archive/2011/11/21/2257442.html    http://www.cnblogs.com/leejersey/archive/2012/11/27/2790998.html debugger: js中调用console写

5个Xcode开发调试技巧

转自Joywii的博客,原文:Four Tips for Debugging in XCode Like a Bro 1.Enable NSZombie Objects(开启僵尸对象) Enable NSZombie Objects可能是整个Xcode开发环境中最有用的调试技巧.这个技巧非常非常容易追踪到重复释放的问题.该技巧会以非常简洁的方式打印指出重复释放的类和该类的内存地址. 怎么开启僵尸对象呢?首先打开 Edit Scheme (或者通过热键?<),然后选择Diagnostics选项卡,

(转) Java程序员应该知道的10个调试技巧

原地址:http://www.csdn.net/article/2012-09-03/2809495-java-debugging-tips-with-eclipse 调试可以帮助识别和解决应用程序缺陷,在本文中,作者将使用大家常用的的开发工具Eclipse来调试Java应用程序.但这里介绍的调试方法基本都是通用的,也适用于NetBeans IDE,我们会把重点放在运行时上面. 在开始之前,推荐大家去看看Eclipse shortcuts这篇文章,它将会给你带来很多方便.在本文中使用的是Ecli

Ganglia 调试技巧

Gmond # 检查Gmond服务是否正在运行,发出如下命令:ps aux | grep gmond 输出: root      8046  0.0  0.0 103244   844 pts/0    S+   09:38   0:00 grep gmond nobody   25759  1.8  1.0 206388 82356 ?        Ssl  Apr28 208:45 /usr/local/sbin/gmond --conf=/etc/ganglia/gmond.conf #