CVE-2010-2883分析
简介
- 2012年3月29日,纽约时报报道了一个由TrendMicro发布的APT攻击分析报告——Inside an APT Campaign with Multiple Targets in India and Japan。根据这份报告,该攻击针对印度和日本的航空航天、军队、能源等单位进行了长时间的渗透和刺探。报告显示这次攻击行动是通过钓鱼邮件开始的,例如针对日本目标的钓鱼邮件的内容大都跟福岛核电站的核辐射问题有关。攻击利用了很多针对pdf/rtf的漏洞。
分析环境
- 操作系统 win7 32
- 虚拟机 vmware
- 分析软件 OllyDbg、010Editor、PDFStreamDumper、IDA
- 漏洞软件 Adobe Reader 9.3.4
使用字符串定位漏洞
- 用ida反汇编CoolType.dll,查看字符串可发现“SING”字体。该字符串是漏洞解析出错的地方。
使用pdfStreamDumper分析PDF
SING表的TableEntry结构
typedef sturct_SING
{
char tag[4];//标记SING
ULONG checkSum;//校验和
ULONG offset;//相对文件偏移
ULONG length;//数据长度
}TableEntry;
TableEntry结构入口偏移0x11c即是SING表的真实数据。
- 执行strcat后,会将58 e0 8d ad起始部分复制到ebp指定地址
动态调试
- 跟踪执行,到BIB模块
-
再次跟踪到CoolType
-
上方指令call eax为样本数据0x4a80cb38,该地址位于icucnv36.dll模块
-
单步进入
-
返回后看到
-
回头看pdf提取出的数据
-
跳转体制的稳定性主要依靠0x4a82a714和0x4a80cb38
-
位于icucnv36.dll的地址空间,在adobe reader各个版本,这个dll的这两处地址始终不变。
-
0c0c0c0c是特意构造的,通过pdf中的javaScript实现Heap Spary,进而跳转到shellcode。
-
其中代码为构造64kb的小块,在狗仔512的大快。堆喷的原理:系统在分配内存的时候,低二字节地址不会改变的,例如第一次申请可能为12340000,第二次分配可能就是12350000,64kb=0x10000相当于把0x10000内的0c0c全部填充为shellcode
-
当返回栈顶的时候,栈中的数据即是上边javascript代码中的shellcode,利用rop绕过dep
-
创建了一个名为iso88591的文件
-
利用rop调用CreateFileMapping,创建文件内存映射。
-
调用MapViewofFile
-
调用memcpy
-
目的地址就是前面MapViewOfFile返回的地址,源地址就是shellcode的地址,复制到一段可执行可读写的内存段,以此绕过dep。构造的rop指令位于均不受icucnv36.dll,因此也可以绕过aslr。
漏洞修复
- 官方在修补漏洞的时候,添加了字符串长度检测,sub_813391e代替了原来的strcat。
- 补丁比较
- 将原本导致漏洞的函数,改为strncat,同时根据字符长度分配空间。