cve-2010-2883

操作系统:windows 7 home premium x64本来用xp sp3,但32位的ida没找到

漏洞软件:AdbeRdr934_en_US

工具:ollydbg

简介:典型的栈溢出漏洞,CoolType.dll在解析字体文件SING表中的uniqueName字段的调用了strcat函数,但是没有检查uniqueName字段长度,造成栈溢出漏洞。

利用思路:

  1. 利用pdf文件可执行js代码特性,用js在堆中写shellcoderop绕过depicucnv36.dll))
  2. Pdf-->ttf-->SING-->uniqueName域,构造uniqueName域字段,造成栈溢出,劫持eip跳往icucnv36.dll(未开aslr),通过rop链使栈顶变为0x0c0c0c0c,通过0x0c0c0c0c地址里储存的icucnv36模块中指令地址实现rop,通过rop和栈配合不断布置寄存器,通过retn跳往下一栈指令点,完成以下功能:新建临时文件,将文件映射到内存,将真正的shellcode拷贝到内存的某一块区域(可读可写可执行)并且解码这些shellcode然后跳到该内存区域执行

Exploit样本类型:pdf文件

分析过程:

准备:

练手的第一个cve,虚拟机装xp系统以及软件Adobe Reader 9.3.4

懒得打开kali了,直接分析资料包里msf.Pdf文件

 

1.使用PdfStreamDumper打开msf.Pdf文件

(PdfStreamDumper可以处理混淆过的javascript代码,不常见的PDF头和对象以及shellcode

初步分析,在1-9stream中信息量不大

1)第十个stream发现sing字段

 

TableEntry入口偏移0x11c位(开始以为是284字节,找了一圈没发现,其实是284位)找SING表真实数据

 

00 00 01 00”开头的就是SING表真实数据,再偏移0x10位找到uniqueName域,以“98 66 51 e6”开头(与书中不一致,这一部分会被复制到栈中,造成栈溢出,等会用od证实是否如此),以0x00结尾

2)以及第12stream中发现js代码以及shellcode

 

2.下面用od动态分析,打开Adobe Reader,od附加到该程序上

 

打开后按e看看它加载了哪些模块,可以看到出问题的模块CoolType.dll

 

同时也找了下icucnv36.dll,并没有找到

双击进入CoolType.dll模块,想找使用strcat函数(漏洞处)的地方下断点,用ida分析下cooltype.dll找下其虚拟地址

 

①.打开安装目录用ida分析cooltype.dll

开始找的是call strcat的地址,一大堆

 

 

 Tip:这里注意到一个细节,就是用ida打开一个dll,那代码段这边的地址0x08001000本来以为是相对虚拟地址RVA,实际上是个基址为0x08000000的虚拟地址VA。所以用od附加一个程序,程序加载了这个模块,然后模块基址是0x68cc0000,指令虚拟地址应该是0x68cc10000x68cc0000+0x08001000-0x08000000))

Call strcat地址太多,尝试定位SING字符串,调出string窗口,filtersing

找到后交叉引用功能

 

 

逐个排查,定位地址0x68cc0000+0x0803DDAB-0x08000000=0x68cfddab

 

ctrl+God中搜索地址并断点

 

②动态分析样本

跟着走一遍,没看出个大概,对汇编分析下流程

断点断的前面一点

 

数据窗口中跟随该地址可以看到

 

可以看到是之前分析过的uniqueName字段

单步执行到strcat,观察栈区数据,栈顶是栈底地址,待会要把字符串复制到这个地址,esp+4是数据地址,是样本构造的数据

 

单步步过,观察栈底区域,可以看到数据已被替换为上述数据窗口中数据,可以看出栈区地址上低下高,左高右低0x98所待得位置就是0x002de20c

 

数据复制到0x00NULL)停止

继续单步,分析结果

 

跟着跳转

 

通过esi助攻,此时eax里面已经存放了构造样本中第一个rop地址Icucnv36.4A8A08C6

再次去翻了下加载的模块,此时icucnv已经加载进来了

 

又跟丢了,怀疑是rop链地址有问题,去icucnv模块查了下,相应地址的指令没问题,再跟吧

检查了样本中0x4a80cb38以及0x4a82a714地址没问题,堆地址0x0c0c0c0c也没有问题

 

 几次单步后eax修改为0x003cdfe0,里面存着第一个rop地址

 

第一个rop执行

 

首先调整了ebpEbp=ebp+0x794=0x002ed8d8 ebp调整进了覆盖的栈区数据范围内。接下来执行的leave(mov esp,ebp pop ebp),修改了espesp = 0x002ed8d8+0x4 ,ebp = 0xe78b53ab(构造的随机数据)

retn时,[esp] = 0x4A82A714 因此接下来EIP = 0x4A82A714

紧接着是第二个rop点,修改栈顶[esp]=0x0c0c0c0c

 

此时,栈中是用js0x0c0c0c0c处写的shellcode

Retn:以栈顶储存值作为返回地址,retn后首先进入0x4a8063a5,下面又是一套组合拳rop

Rop-3

 

ecx =0x4A8A0000

Rop-4

栈顶0x0c0c0c0c往上的地址储存的都是要跳转的地址,通过要跳转位置的retn跳到下一个栈位(当前栈顶)储存的地址

 

[0x4a8a0000]=[ecx]=0x0020e244

[0x0020e244]=0x4a80cb38

Rop-5

 

 

 

Eax储存creatfileA的地址,并且esp+4

Rop-5

Retnjump creatfileA 指令地址

 

参数栈:

 

查阅资料,参数意义如下:

FileName用于指定被创建文件的文件名。

Access 用于指定访问权限一般都是读、写之类的。这里的GENERIC_ALL指的是采用所有可能的访问权限。

ShareMode 用于指定请求的文件或设备的共享模式,这里指定的0代表了阻止其他进程在请求删除,读取或写入访问权限时打开文件或设备。

pSecurity 用于设置安全描述符和子进程是否可继承,这个属性可为NULL,这里用的就是NULL

Mode设置对文件执行的操作。这里的CREATE_ALWAYS代表总是会创建文件,即使目标文件已存在也会覆盖它。

Attributes 设置文件或设备属性和标志,这里给的值是FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_TEMPORARY 代表该文件用于临时存储。

hTemplateFile 设置具有GENERIC_READ访问权限的模板文件的有效句柄。这个属性这里也没用到直接指定NULL

Rop-6

 

Ecx=0x4a801064

esp=Esp-4=0x0c0c0c4c

Rop-7

 

Xchg,交换指令

Eax=0x0020e28c

Edi=0x000004f4

Rop-8

 

Ebp=0x00000008

Rop-9

 

Rop-10

 

Eax指向createfilemappingA

Rop-11

 

转到 [eax] 所在的函数 CreateFileMappingA处,该函数用于创建一个文件映射内核对象

 

参数栈:

 

Rop-12

 

Rop-13

 

Rop-14

这些rop指令与之前手法相同

 

Rop-15

相同手法调用MapViewOfFile

 

参数栈:

 

参数都是栈里shellcode安排好的,之前大量pop ebp 交换寄存器之类的,用栈内数据去替换寄存器数据,这些函数会用到寄存器内数据,需要提前安排好

Rop-16

 

Rop-17

 

 

 

 ……

一连串的rop,终于到最后一个函数memcpy,源地址为真正shellcode代码,将她复制到 一段可读可写的内存段,绕过dep

 

参数栈:

 

然后通过retn返回到0x3690000执行真正的shellcode

8.有个循环,应该是解码用的

 

 

 

至此栈溢出利用流程结束,实现的恶意功能扫了眼过去了

 

posted on 2020-04-27 16:15  风袖袖  阅读(331)  评论(0)    收藏  举报

导航