[ 登录 ][ 注册 ] 天极传媒: 比特网 | 天极网 | IT专家网 | IT商网 | 52PK游戏网 | 手机天极 | IT分众 |
您现在的位置: IT专家网 > 安全子站 > 评论分析

科普:分析一个flash exploit的样本

作者: int3,  出处:安全中国, 责任编辑: 郭秋爽, 
2008-06-24 09:35
  本文是对flash exploit的样本进行分析研究,希望能对大家有所帮助。

  有不少朋友一直怂恿我写这么一个马后炮分析的文章,也拖了好久,现在放出来了。

  首先感谢Mark Dowd发现这个漏洞并且分享了一些关于这个漏洞通用利用的方法。

  再阅读这篇blog之前,请熟读Mark Dowd关于Flash exploit的whitepaper和Flash 9文件格式以及Adobe关于AVM2的详细文档。先简单的回顾一下flash文件格式,一个SWF文件是由SWF header和若干tag来组成的。

  SWF Header Format

  

  Mark Dowd提到的一些SWF结构用于编写这个exploit:

  DefineSceneAndFrameLabelData 86

  DefineBits 6

  DOABC 82

  SHOWFRAME 1

  其中SWF Tag format有2种类型:

  Short Type (2 bytes)

  Upper 10 bits: tag type Lower 6 bits: tag length

  Long Type (6 bytes)

  Tag type and length of 0×3F + 4 bytes Length

  在这个例子中是采用的是Short类型的Tag format,所以我们需要decode一下Tag然后获取正确的Tag type,decode以后我们可以发现这些Tags对应的偏移位置。

  DefineSceneAndFrameLabelData位于文件偏移的0×41e处。

  

  值得一提的是SWF文件格式中的整数类型是经过Encoded,根据LibMing中提到的算法:

  #define ENC_HIGH_BIT 0×80

  #define ENC_BYTE_MASK 0×7f

  unsigned char temp = i & ENC_BYTE_MASK;

  i = i >> 7;

  if(i > 0)

  temp |= ENC_HIGH_BIT;

  解码算法:

  #define ENC_BITSPERBYTE 7

  #define ENC_BYTEMASK 0×7f

  #define ENC_HIGHBIT 0×80

  do

  {

  if(shift > 4 * ENC_BITSPERBYTE)

  break;

  temp = readUInt8(f);

  result |= (ENC_BYTEMASK & temp) << shift;

  shift += ENC_BITSPERBYTE;

  } while (hasNextByte(temp));

  文件中的99 be 8e a0 08 就是一个encoded的整数值,decode以后获得的值为:

  0×08a08eb4是经过计算后的Opcode Mark的位置,根据Mark Dowd提到的算法:

  address = AS3_argmask_address + (marker_byte – (marker_byte % 4)) + 4

  scene_count = (0×80000000 | (address / 12))

  再次还原后得到的值为0×302b3928 ,对应flash.ocx中Marker值0xf8的索引位置。

  DoABC位于文件偏移的 0×463处,其中修改过的ABC(Action Byte Code)在0×5b3处。

  

  这段ABC符合Mark Dowd的whitepaper中的描述:

  F8 62 79 get_local

  F8 62 75 get_local

  F8 E8 25 FB FF FF 00 pushshort

  F8 29 02 pop nop

  F8 63 79 set_local

  02 … 47 nop … returnvoid

  为了能够让大家更好的理解这个漏洞,这里简单的描述一下这个漏洞利用原理:

  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中恢复进程的上下文等。

网友评论

笔名 
请您注意:遵守国家有关法律、法规,尊重网上道德,承担一切因您的行为而直接或间接引起的法律责任。    IT专家网友拥有管理笔名和留言的一切权利。

邮件订阅


    • 解析Windows密码安全问题(第三部分)评论
      在前两部分文章中,我们讨论了Windows密码政策的问题以及它是如何在Active Directory环境被控制等问题,大家应该还记得在默认情况下密码政策和相关的设置位于默认域策略中(Default Domain Policy)。另外同样探讨了可以使用哪些技术破获windows密码,以及每种攻击方式的限制问题。那么,在本文中,我们将讨论如何让windows密码变得更加安全,以及如何能够解决在前两部分文章中出现的所有问题。本文将涉及Windows2002/2003/2008Active Directory默认安装带来的可能性以及其他能够整体提高密码安全的技术。
    • IDC创新和安全白皮书:合作或竞争评论
      业务创新是业务发展战略非常重要的一部分,并而日益成为公司保持竞争优势的决定性因素。由于创新的战略重要性,导致了我们越来越关注信息安全机制在抑制甚至扼杀业务创新方面起到的作用。IDC认为公司不仅是需要找到业务创新和有可能扼杀这种创新的信息安全机制,而且需要在这两者之间找到一个简洁的平衡来满足自己的业务需求。成功的企业能够在商业竞争中占有优势,是因为他们懂得去合理的利用两者使之成为一种具有杠杆作用的机制,而其它的企业只是单单强调其中的一个。
    • 预防企业数据丢失的6种最佳实践评论
      根据“私有权清算中心”(一家非赢利性消费者信息和倡导组织)的统计,自2005年1月以来,有将近2200万条记录遭到破坏。数据失窃和丢失案件数量惊人,这不仅是因为安全入侵事件正在以惊人的速度持续增长,数据丢失引发的财产损失事件也同样在飞速增加。根据美国政府的估计,所谓的“企业数据丢失”在去年使商业界损失了近1050亿美元。根据波尼蒙研究所(Ponemon Institute)的统计,仅仅内部人士导致的数据受损一项,每年给商业界造成的损失为平均每家公司3-4百万美元。产业分析公司Gartner集团估计,恢复数据的开销可以达到每条破坏记录150美元之高——这一数字还没有包括重拾客户信任和重建品牌价值、可能的罚款以及法律诉讼代理费的资金投入。在企业数据丢失案件有增无减的同时,公司也正在不断搜集更多数据,以求优化商业流程,改善客户服务,以及提升与合作伙伴的关系。更多的数据转化为相关数据在整个企业中数量不断增多的信息系统之间更广泛的传播。其结果就是——随着公司内外越来越多的用户获得接入系统的权限,敏感数据遭到破坏的风险也在不断增大。
    • RSA白皮书:管理银行的信息风险评论
      信息是银行的基础,但直到现在,金融机构还往往满足于以业务封闭式的方式管理风险。然而,行业的压力促使银行开始对这种战略展开思考。