漏洞分析学习之cve-2012-0158

2020-03-31 约 266 字 预计阅读 2 分钟

声明:本文 【漏洞分析学习之cve-2012-0158】 由作者 NoOne 于 2020-03-31 10:03:55 首发 先知社区 曾经 浏览数 120 次

感谢 NoOne 的辛苦付出!

漏洞分析学习之cve-2012-0158

测试环境:

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分析

关键词:[‘安全技术’, ‘漏洞分析’]


author

旭达网络

旭达网络技术博客,曾记录各种技术问题,一贴搞定.
本文采用知识共享署名 4.0 国际许可协议进行许可。

We notice you're using an adblocker. If you like our webite please keep us running by whitelisting this site in your ad blocker. We’re serving quality, related ads only. Thank you!

I've whitelisted your website.

Not now