|
不少朋友一直怂恿我写这么一个马后炮分析的文章,也拖了好久,现在放出来了。
首先感谢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 |
[1] [2] 下一页 |