分析Flash Exploit的时候,为了分析详细的执行过程,需要给JITed code设断点。而JITed code是随机放在heap上的,如何定位这些JITed code的地址,如何将actionscript function与JITed code对应起来?感谢Haifei大牛的idea! 随便写写,有兴趣的随便看看,如有错误之处,请斧正! 之前在分析flash exploit的时候,需要给JITed code设置断点,方便跟踪。JITed code调试的难点在于这些code在heap中的位置是变动的,为了能够给JITed code设置断点,我们需要知道何时JITed code被部署好,在那之后,就可以设断点了。 MethodInfo对象用于存储method相关的信息,+4h的偏移位置是用于存放function address,包括native function, JITed function, interp function。调试以后,会发现verifyMethod的实现中每当verify相应的函数以后,相应的位置便更新为正确的地址了(有兴趣的同学,可以自己调试一下)。所以,我们可以在每一个verify*函数之后,取对应的函数地址。 其中,ESI存放的是method_info pointer,所以,function address应该是poi(esi+4)。 现在我们知道如何取到function address,但是如何与actionscript bytecode对应起来?毕竟在Adobe SWF Investigator里能看到只是下面这样。 可以看到每一个函数都有一个method_id,AVM又是如何处理method_id的? 分析以后,可以知道:AVM在解析constant pool的时候,需要调用parseMethodBodies,这个函数主要是将每一个函数的body解析出来。在这里,可以拿到method_index与相应的method_info指针。 写一个简单的windbg script,调试结果如下: 这样,在函数执行之前,就可以断住相应的JITed code了。 除了上面介绍的方法,还有一种变通的思路:如果可以修改actionscript,在需要调试的函数首部增加一些探针函数,如MathUtils::ceil, MathUtils::round之类的函数,只要可以断住这些函数,再找到caller即可,后续相应的code便可以被调试了。 调试用的flashplayer详细信息如下: 写了个工具,用于调试flash JITed code,放在这里,有需要,自己玩。https://github.com/michaelpdu/flashext
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!