Exploit UserAfterFree 2017/07/14
CVE-2015-0313分析

0x00.环境

系统::WIN7 X86 SP1

影响软件:flash_player_16.0.0.296

EXP: main.as

0x01.成因

globalMemory中byteArray释放但还保留了指针,从而导致UAF

0x02.要点

  1. 为何要用到多线程?

不用多线程和MessageChannel的话,下面代码会不起作用

    ApplicationDomain.currentDomain.domainMemory = ba   // 设置ba为全局内存可访问
  1. 下面代码什么作用?
    ov[i][0] = ba
    ov[i][1] = this

用来后面泄漏vtable和新的byteArray用

  1. 为什么Ojbect长度是1014,而uint是1022?
ov[i] = new Vector.<Object>(1014)   // 1014=0x3f6
ov[0] = new Vector.<uint>(1022)  // 1022=0x3FE

Vector.前有0x28被用,而Vector.前有8字节备用,合起来都是0x1000

  1. 为何要在OnMessage函数中设置buffer长度?
casi32(0, 1022, 0xFFFFFFFF) // ba长度被修改为0xFFFFFFF

要确保执行顺序,保证0x1000的Buffer落在之前释放的Vector.

  1. 代码中多次出现-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