目标: SWF (任意代码执行) (Shellcode部分)
版本: SWF Various Versions
来源: hxxp://securescanpc-win.com/swf.php
工具: Redoce 2.026 / OllyDebug / Sothink SWF Decomplier
语言: Flash Action Script
SAC#09004
www.sacour.cn 转载保留此行

文件信息:
文件: swf.swf
MD5 : ADEA0F58B140B67089CC0091318A7E91
大小: 10,746 字节
时间: 2009-8-10 19:32:04

文件结构:
Frame 1  -  Action:  Flash\\Lib (Exploited) , @Main , Asdfghkl , Boot_822757 , Intlter , Myclasses , Std.

AS:
在模块MyClass中可以轻易看到恶意代码所在,
   var _loc_13:* = null as String;  //首先是定义了一个String类变量
   var _loc_1:* = "46575....." //ShellCode
   var _loc_14:* = Capabilities.playerType; //获取播放器类型
    var _loc_15:* = Capabilities.version; //获取版本
   if (_loc_14 == "PlugIn") //检测类型
   {if (_loc_15 == "WIN 9,0,16,0")
      { _loc_13 = _loc_3;}  // 检测版本
    if (_loc_15 == "WIN 9,0,28,0")
       {_loc_13 = _loc_6;}
......
   else{ .....  }

SHELLCODE:
习惯性的我直接拿出了Shellcode来调试,不过,OD给出的前几行代码是:
00405000 >  46              inc     esi
00405001    57              push    edi
00405002    53              push    ebx
00405003    0825 06000030   or      byte ptr [30000006], ah
00405009    0A00            or      al, byte ptr [eax]
0040500B    A0 000C0303     mov     al, byte ptr [3030C00]
00405010    44              inc     esp
00405011    1108            adc     dword ptr [eax], ecx
00405013    0000            add     byte ptr [eax], al
00405015    0043 02         add     byte ptr [ebx+2], al
00405018    FFFF            ???                                      ; Unknown command

明显的出了问题,重新看看AS部分,
 

 _loc_17 = _loc_13.split("");
var _loc_19:int;
while (_loc_19 < _loc_17.length)
{_loc_18.push(Std.parseInt("0x" + _loc_17[_loc_19] + _loc_17[_loc_19 + 1]));
_loc_19 = _loc_19 + 2;}

这是什么?.parseInt又是什么?搜索了一下:
  public static int parseInt(String s,int radix) throws NumberFormatException
使用第二个参数指定的基数,将字符串参数解析为有符号的整数。除了第一个字符可以是用来表示负值的 ASCII 减号 '-' ('\u002D’)外,字符串中的字符必须都是指定基数的数字(通过 Character.digit(char, int) 是否返回一个负值确定)。返回得到的整数值。

那么,这么看,这段应该是被16进制加密的SHELLCODE啊,为什么执行不了?继续看,
......
ldr = new Loader();
ldr.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler);
ldr.loadBytes(_loc_16);
return;
}

public function completeHandler(param1:Event) : void
{Lib.current.stage.addChild(ldr);return;}

等等,为什么会是addChild的方式……看看上面的“ShellCode”前几个字:
46 57 53
'F'  'W'  'S' 

原来是这样……嵌套了一个SWF,怪不得会有这个情况出现了,那么我们就提取出它嵌套的SWF,导出资源(图片682),为什么导出这个?因为他没其他什么可导出的了,其实ShellCode就在这个里面,不过我没有找到它的起始位置,但是使用XorKey枚举可以轻易发现0x3D的xorkey匹配了:hxxp://securescanpc-win.com/load.php?id=7?07002da639a9a060000000002c1503193000104090000000017。