CVE-2015-0313分析
0x00.环境
系统::WIN7 X86 SP1
影响软件:flash_player_16.0.0.296
EXP: main.as
0x01.成因
globalMemory中byteArray释放但还保留了指针,从而导致UAF
0x02.要点
- 为何要用到多线程?
不用多线程和MessageChannel的话,下面代码会不起作用
ApplicationDomain.currentDomain.domainMemory = ba // 设置ba为全局内存可访问
- 下面代码什么作用?
ov[i][0] = ba
ov[i][1] = this
用来后面泄漏vtable和新的byteArray用
- 为什么Ojbect长度是1014,而uint是1022?
ov[i] = new Vector.<Object>(1014) // 1014=0x3f6
ov[0] = new Vector.<uint>(1022) // 1022=0x3FE
Vector.
- 为何要在OnMessage函数中设置buffer长度?
casi32(0, 1022, 0xFFFFFFFF) // ba长度被修改为0xFFFFFFF
要确保执行顺序,保证0x1000的Buffer落在之前释放的Vector.
- 代码中多次出现-1是为什么?
Atom作为ActionScipt中原子类型,规定了最低3位的使用
* 32 bit atom
*
* 31 16 15 8 7 3 210
* dddddddd dddddddd dddddddd ddddd TTT
*
* TTT
* 000 - untagged
* 001 object
* 010 string
* 011 namespace
* 100 undefined
* 101 boolean
* 110 integer
* 111 double
001刚好代表object