漏洞分析学习之cve-2012-0158
2020-03-31 11:03:55 Author: xz.aliyun.com(查看原文) 阅读量:356 收藏

测试环境:

X 推荐环境 备注
操作系统 win_xp_sp3 简体中文版
虚拟机 vmware 15.5
调试器 Windbg Windbg_x86
反汇编器 IDA pro 版本号:7.0
漏洞软件 office 版本号: 2007_pro

office下载地址,ed2k

ed2k://|file|en_office_professional_2007_cd_X12-42316.iso|458766336|D2DA91160A98717D3BA6487A02C57880|/

激活码为:

D283T-87RKQ-XK79C-DQM94-VH7D8

序言

这个环境可真是折腾我好久,msdn i tell you开头下载很慢,放弃了,找了很多下载站,下下来的都运行不了执行弹计算器的,无奈,最后返回msdn i tell you下载的,

下完安装好后开始调试,同样,先进行基于poc的验证分析

基于poc的验证分析

这个poc直接用漏洞战争随书资料里的poc进行测试,附加运行后

很明显看到eip被改了,用kn看栈发觉栈被破坏的很严重,这里先补充一点知识,windbg命令

dds, dps,dqs

  • dds 将4个字节视为一个符号,英文猜测是dump dword symbol
  • dqs 将8个字节视为一个符号,英文猜测是dump qword symbol
  • dps 根据处理器架构来选择

这里我们利用dps来看栈,因为此时esp是不会被破坏的,然后我们看下esp

这里可以看到有一个dll出现了,MSCOMCTL,我们通过ub查看此处的汇编代码

这里看到了一个call,我们记录下来

地址 指令
275c8a05 call MSCOMCTL!DllGetClassObject+0x41a29 (275c876d)

然后继续断下,回溯,基于栈回溯的漏洞分析方法,然后可以得到一张表

地址 指令
275c8a05 call MSCOMCTL!DllGetClassObject+0x41a29 (275c876d)
275c89c7 push ebp

这里注意的是还需要用一个指令

sxe ld:MSCOMCTL

这是在加载MSCOMCTL这个dll的时候断下,因为是动态加载的,没办法一开头下断,所以需要注意下,这里我们可以在275c8a05断下后跟进分析,第一次我先步过,查看结果

看到这里,栈已经被破坏掉了,他破坏的是外层结构的栈,

在看到这里的时候,我觉得就找到地点了,运行后,确实如此,这里ecx值偏大了,导致溢出,ecx本身是0x8282,然后右移变为0x20a0

步过后

这里可以看到,上一层的栈结构已经被破坏了,没有必要在跟了

我们回溯法找到该函数开头

而275c89c7便是函数开头了,找到关键便可以进行源码分析了

源码分析

打开ida找到275c89c7

int __stdcall sub_275C89C7(int a1, BSTR lpMem)
{
  BSTR v2; // ebx
  int result; // eax
  int v4; // esi
  COLLSTREAMHDR COLLSTREAMHDR; // [esp+Ch] [ebp-14h]
  int v6; // [esp+18h] [ebp-8h]
  int v7; // [esp+1Ch] [ebp-4h]

  v2 = lpMem;
  result = sub_275C876D((int)&COLLSTREAMHDR, lpMem, 0xCu);
  if ( result >= 0 )
  {
    if ( COLLSTREAMHDR.dwMagic == 0x6A626F43 && COLLSTREAMHDR.cbSize >= 8 )
    {
      v4 = sub_275C876D((int)&v6, v2, COLLSTREAMHDR.cbSize);
      if ( v4 >= 0 )
      {
        if ( !v6 )
          goto LABEL_8;
        lpMem = 0;
        v4 = sub_275C8A59((UINT)&lpMem, (int)v2);
        if ( v4 >= 0 )
        {
          sub_27585BE7(lpMem);
          SysFreeString(lpMem);
LABEL_8:
          if ( v7 )
            v4 = sub_275C8B2B(a1 + 20, v2);
          return v4;
        }
      }
      return v4;
    }
    result = -2147418113;
  }
  return result;
}

这里可以进行合理的猜测,毕竟没有函数名,lpMem为传入的字符串,而关键点便在

v4 = sub_275C876D((int)&v6, v2, COLLSTREAMHDR.cbSize);

这里很像 strncpy, 也就是size太大导致,栈溢出

漏洞利用

知道漏洞成因,但现在还不知道漏洞如何利用,看下poc如何写的

在poc中搜索41414141

这里需要注意两个点,一个是返回地址,一个是复制长度,跟我分析的第一篇office的类似啊,那篇是rtf的,不过差不多,反正知道怎么利用就行,我们这里限制长度,然后进行利用就行了,然后接下来就是jmp esp了,具体利用就不在细说了,需要注意的是,这里有ret 8,所以溢出点往后移动16位才是shellcode地址,跟上一篇一样,

这里分析下msf生成的exp吧,一样在call处下断,跟进去,追到复制部分,然后复制过后查看栈

看这里,外层的栈已经变成了jmp esp了,接下来就是执行shellcode了,至于构造部分,看我上一篇

漏洞分析学习之cve-2010-3333

利用截图

总结

  1. 至此,漏洞战争栈溢出部分算复现完了,还有一篇无法复现,由于找不到那个版本的office,所以暂时放弃
  2. 栈溢出在有了linux的pwn基础上,还是相对比较简单的,因为套路几乎都是一样的,只是seh部分攻击感觉比较新一点(just for me)
  3. 这次也终于利用上了 sxe ld:模块名,还测试得比较好
  4. 此篇参考文章较少,只有在栈回溯那会,不知道命令,查了下,dps命令

接下来要进入win的堆的学习了,相信会是一个很大的挑战

Windbg总结

sxe ld:模块名 在加载模块时候断下

dds, dps,dqs

  • dds 将4个字节视为一个符号,英文猜测是dump dword symbol
  • dqs 将8个字节视为一个符号,英文猜测是dump qword symbol
  • dps 根据处理器架构来选择

参考文章

cve-2012-0158两种poc分析


文章来源: http://xz.aliyun.com/t/7464
如有侵权请联系:admin#unsafe.sh