综述
本文内容基于漏洞战争一书中对于漏洞CVE-2010-2883攻击样本的分析,在书中分析的基础上,本文着重展现漏洞利用过程中shellcode的执行过程,通过调试加深对漏洞利用过程的理解。
由于本文图片数量较多,所以分为上下两篇文章发布 由于博客图片显示不清楚,故给出高清原文下载链接: https://pan.baidu.com/s/1KFyD8FJQXbiTfC2vmEmBMw 提取码: mq6h
实验环境
漏洞利用环境与书中要求的一致,不再赘述
漏洞成因
以下指令存在于模块CoolType.dll中,其中最后一条指令的strcat函数因为没有对参数的有效性进行检验,故存在被利用于进行缓冲区溢出攻击的风险,具体漏洞成因可见漏洞战争一书。
调试过程
使用od附加指定版本的adobe reader程序,按f9运行,程序初始化完毕后CoolType.dll已经被加载到进程空间中。
根据书中给出的溢出点,在0x803ddab地址(即溢出函数strcat)上下断点,之后使用adobe reader打开攻击样本,程序将断在该断点处。
溢出发生之后继续f8调试,发现程序在指令call 08016bde之后跑飞,则推测该函数中执行漏洞利用指令,故进入该函数分析
在08016bde函数中程序执行call 0801bb21时跑飞,则继续跟进该函数
函数0801bb21中,程序在地址0801bb41处跑飞,跟进该函数
函数0801bb41中,程序在地址0808b308处跑飞,跟进该函数
f7跟进0808b308地址处的指令,发现第一个rop块,此时程序执行流程已经被改变,分析原因发现地址0x0808b308处的指令为call [eax],此时eax为0x0012e6d0,而在strcat产生溢出的过程中,内存地址0x12e4d8之后的内存会被覆盖,所以地址0x0012e6d0处的内存可以被修改,从而产生了进程劫持的可能。
这里的leave指令相当于mov esp,ebp pop ebp,该指令执行完成后栈顶被重新设置为12e4e0,该部分内存也已经被溢出覆盖,使得程序可以继续顺着rop链执行。
第二个rop块是将esp设置为0c0c0c0c,推测漏洞利用过程中使用了堆喷射技术,通过该rop块,将栈顶修改为0c0c0c0c,从而完全掌握栈的控制权。
通过在攻击样本中嵌入JavaScript代码,实现当pdf文件被打开时执行堆喷射操作,相关堆喷代码可以通过工具PdfStreamDumper打开样本得到,也可参看漏洞战争一书中的内容。
Rop3中将ecx指向指定字符串,推测在设置相关函数参数
Rop4
rop5中将eax指向CreateFileA函数,疑似之后需要调用该函数。
调用CreateFileA函数,创建名为iso88591的文件
CreateFileA函数内部调用CreateFileW函数 之后执行retn 1c返回
CreateFileW函数返回后执行rop块,继续返回
执行pop ecx retn,可以看见栈中存在CreateFileMappingA函数的地址,推测此时shellcode正在构造参数准备调用该文件映射函数。
交换eax和edi的值
给ebx赋值
将CreateFileMappingA的地址赋值给EAX,推测准备调用该函数
调用CreateFileMappingA函数
在CreateFileMappingA函数内部调用CreateFileMappingW函数之后retn 18返回
疑似准备构造参数,调用MapViewOfFile函数
综上调用MapViewOfFile函数的套路和调用CreateFileMappingA的套路相同
MapViewOfFile函数内部调用MapViewOfFileEx函数
执行return
将ecx指向字符串"32",疑似设置参数
注意下图中执行指令call ecx之后程序即跳转执行retn,返回继续执行add esp,10和retn
call ecx之后执行retn指令
memcpy函数内部
(勘误:上图中edi指向0x3721000而不是esi)