CVE-2018-2883分析

参考链接:https://bbs.ichunqiu.com/thread-9720-1-1.html

实验环境:

Win7 64

漏洞程序:

Adobe Reader9.3.0

漏洞原因:

漏洞原因在cooltype.dll文件中,由strcat调用产生的栈溢出漏洞
	strcat(dst,src)函数,由于dst的第一个字符变为00,因此连接时是将src直接复制到dst所在位置。而src特别长,导致溢出

漏洞利用原理:

由于strcat()之后程序将调用大于dst且小于src空间的某处,而一旦src而修改,则可将其修改为shellcode地址或者ROP的地址,进行漏洞利用。

实验操作:

(探究从哪里执行的exploit?)

1、打开程序,OD附加,ctrl+e来到调用cooltype.dll后,双击进入
CVE-2018-2883分析_第1张图片
2、点击中文搜索引擎->智能搜索,搜索字符串sing,来到strcat函数附近(注意,这里选择第二次搜索得到的sing,因为有多处调用sing,每次不同)
CVE-2018-2883分析_第2张图片
3、在0x6657DC98处下断点,点击运行。用Reader9.3打开msf文件,则程序在该断点处断下。
CVE-2018-2883分析_第3张图片
此时eax为strcat第二个参数的地址,为0x06024D0C,查看数据窗口发现eax的长度为573个字节

4、单步继续,查看strcat第二个参数的位置,此时eax=0x0036DE30
CVE-2018-2883分析_第4张图片
5、单步继续,执行mov byte ptr ss:[ebp],0,由于此时ebp=eax,因此将eax的第一个bit变为0
CVE-2018-2883分析_第5张图片
因此执行strcat后,src(0x06024d0c)将直接复制到dst(0x0036de30)位置上

思考一:是在strcat执行完之后执行exploit的吗?
6、此时查看右下角堆栈窗口
CVE-2018-2883分析_第6张图片
如果是strcat执行完之后被覆盖返回地址进而执行exploit,则0x0036ddd8将被覆盖。但是不可能,因为0x0036ddd8小于0x0036de30
此时选中eax右键堆栈窗口跟随,发现返回地址距离eax有7个内存单元。
CVE-2018-2883分析_第7张图片
那么是什么时候漏洞被利用呢?
7、单步F8继续,发现当执行到0x67e6dda8时,出现异常,程序退出(正常情况下应该是calc.exe被弹出,但是我这里是退出)。
CVE-2018-2883分析_第8张图片
那么猜想会不会这个函数的返回地址被覆盖呢?但是不可能,因为他们返回地址处0x0036ddd8位置处,而dst处于0x0036de30比它大,因此不可能被覆盖。那么只有可能是该函数的子函数发生了异常。

8、单步F7进入,跟踪。
CVE-2018-2883分析_第9张图片
同理发现在0x67E46C0E处的函数发生了异常,而此时esp=0036d6c8依然小于dst因此,异常也应该发生在这个函数的子函数内。

8、F7跟进
CVE-2018-2883分析_第10张图片
同理,在0x674baf9处程序退出,说明是该函数的子函数发生了异常。

此时,查看SEH链表为
在这里插入图片描述

9、F7跟进
CVE-2018-2883分析_第11张图片
发现执行到这儿的时候,程序又崩溃退出了,说明是该函数的子函数导致了异常。

10、F7跟进
CVE-2018-2883分析_第12张图片
leave指令=mov esp,ebp pop ebp,因此执行完leave指令后esp=ebp-4=0x0036de38,刚好是dst=0x0036de30后面的第3个内存单元!!!

此时,查看seh
在这里插入图片描述
发现并没有改变,说明exploit并不是通过覆盖SEH来进行exploit的!而是通过上步调用了call[eax],而eax刚好是dst的第3个栈内存单元!因此如果dst可控就能进行exploit!!

11、单步继续
CVE-2018-2883分析_第13张图片
果然程序是执行0x0036de38处的位置了!

12、单步继续,开始执行ROP pop esp retn
CVE-2018-2883分析_第14张图片
单步继续,查看堆栈窗口
CVE-2018-2883分析_第15张图片

最后验证一下是否如此

重新运行程序,OD载入,来到第二次call [eax]处。对EAX右键数据窗口和堆栈窗口跟随,发现数据相同!

CVE-2018-2883分析_第16张图片
注意这里strcat(dst,src)的地址会变化,此次dst=0x0025DCF8,而此时eax=0x0025DEF0,eax-dst=504<573,因此只要将src的505~508位置改为shellcode的地址即可。这里将其改为ROP的地址了!
因此shellcode构造如下:
xxxx+xxxx+xxxx+0c0c0c0c+……+ROP(0x4a80cb38)
在这里插入图片描述
接着跳转到
在这里插入图片描述
此时
CVE-2018-2883分析_第17张图片
接着执行0x0c0c0c0c中的内容了!
CVE-2018-2883分析_第18张图片

你可能感兴趣的:(CVE)