12558网页游戏私服论坛

 找回密码
 立即注册
游戏开服表 申请开服
游戏名称 游戏描述 开服状态 游戏福利 运营商 游戏链接
攻城掠地-仿官 全新玩法,觉醒武将,觉醒技能 每周新区 经典复古版本,长久稳定 进入游戏
巅峰新版攻 攻城掠地公益服 攻城掠地SF 新兵种、新武将(兵种) 进入游戏
攻城掠地公 散人玩家的天堂 新开 进入游戏
改版攻城掠 上线即可国战PK 稳定新区 全新改版,功能强大 进入游戏
少年江山 高福利高爆率 刚开一秒 江湖水落潜蛟龙 进入游戏
太古封魔录 开服送10亿钻石 福利多多 不用充钱也可升级 进入游戏
神魔之道 签到送元宝 稳定开新区 送豪华签到奖励 进入游戏
神奇三国 统帅三军,招揽名将 免费玩新区 激情国战,征战四方 进入游戏
龙符 三日豪礼领到爽 天天开新区 助你征战无双 进入游戏
王者之师 免费领豪华奖励 免费玩新区 6元送6888元宝 进入游戏
查看: 411|回复: 0

CVE-2012-0158漏洞分析报告

[复制链接]

63

主题

63

帖子

136

积分

实习版主

Rank: 7Rank: 7Rank: 7

积分
136
发表于 2019-8-20 11:06:02 | 显示全部楼层 |阅读模式
实验环境操作系统:Vmware Windows xp sp1Office版本:Microsoft OfficeWord 2003 (11.5604.5606)漏洞文件:MSCOMCTL.OCX 6.1.95.45调试器:Windbg:6.12.0002.633 x86前言Cve-2012-0158漏洞出现在MSCOMCTL.OCX,是微软Office系列办公软件在处理MSCOMCTLListView控件的时候由于检查失误,导致攻击者可以通过构造恶意的文档执行任意代码,本文我将分析这个漏洞的起因。漏洞验证我从网上拿到了一个样本:May.doc。首先我在虚拟机用Word打开这个样本,计算器弹出来,接着Word就退出了。但我再一次打开这个样本,发现程序报错。所以在测试前记得先备份,因为下面我们多次要打开这个样本。
漏洞分析
打开样本弹出计算器,所以Shellcode应该会调用WinExec函数。用Windbg附加WINWORD.EXEbp kernel32!WinExec下断然后运行,把样本拖进word程序断在WinExec入口点。这时候计算器还没弹出来,看一下WinExec的参数,发现是a.exe。我去到这个目录,发现它就是一个计算器。看来shellcode应该是把系统的calc复制到别的目录再运行它。WinExec的返回地址是0x00127dee。往上翻翻,没发现shellcode从哪开始。Kb打印堆栈[Asm] 纯文本查看 复制代码ChildEBP RetAddr  Args to Child             00127b20 00127dee 0cd5a5b0 00000000 0cd5a5b0 kernel32!WinExecWARNING: Frame IP not in any known module. Following frames may be wrong.00127b50 275c8a0a 07d8c008 0cd3b868 0001c000 0x127dee00127b8c 00127c05 1005c48b c7000001 4d032400 MSCOMCTL!DllGetClassObject+0x41cc600000000 00000000 00000000 00000000 00000000 0x127c05重新载入,在MSCOMCTL!DllGetClassObject+0x41cc0下断断在这个call的上一句,Kb发现这一层函数的返回地址是0x 275e701a,它前面一个call接着两次p,然后搜索内存0x00127b88发现万能跳转0x7ffa4512shellcode。并且在275c8a05 e863fdffff      call   MSCOMCTL!DllGetClassObject+0x41a29 (275c876d)之前这里还没有被shellcode覆盖,显然,溢出发生在275c8a05 e863fdffff      call   MSCOMCTL!DllGetClassObject+0x41a29 (275c876d)
接着上面,我单步执行是不是很熟悉呢?,到这里我们知道的信息如下:
[Asm] 纯文本查看 复制代码Shellcode执行发生在下面call返回275e7015 e8ad19feff      call    MSCOMCTL!DllGetClassObject+0x41c83 (275c89c7)溢出发生在[Asm] 纯文本查看 复制代码275c8a05 e863fdffff      call    MSCOMCTL!DllGetClassObject+0x41a29 (275c876d)Shellcode通过jmp esp覆盖返回地址利用。顺便dump部分shellcode[Asm] 纯文本查看 复制代码00127b88 12 45 fa 7f 90 90 90 90 90 90 90 90 8b c4 05 10  .E..............00127b98 01 00 00 c7 00 24 03 4d 08 e9 5a 00 00 00 6b 65  .....$.M..Z...ke00127ba8 72 6e 65 6c 33 32 00 df 2d 89 8c 1b 81 7d ef 42  rnel32..-....}.B00127bb8 9d 85 85 d6 4e 99 59 5a 61 d8 54 93 77 77 21 9d  ....N.YZa.T.ww!.00127bc8 4a 62 68 c3 53 a3 83 6a 6b df 5c 5a 8a 1d 2b 4f  Jbh.S..jk.\Z..+O00127bd8 2c 45 28 81 71 f5 40 01 92 8f 05 ba 36 c1 0a 61  ,E(.q.@.....6..a00127be8 61 61 61 73 68 65 6c 6c 33 32 00 8b 98 8a 31 61  aaashell32....1a00127bf8 61 61 61 6f 70 65 6e 00 e8 11 02 00 00 6a ff e8接下来用IDA打开有漏洞的MSCOMCTL.OCX。定位前面那两个关键call,先看上层call[Asm] 纯文本查看 复制代码275e7015 e8ad19feff      call    MSCOMCTL!DllGetClassObject+0x41c83 (275c89c7)首先分配20个字节空间275C89CA sub     esp, 14h        ; 分配20字节局部空间然后调用275C89DA call    sub_275C876D    这个call的功能是从样本读取dwBytes,这里是0CH字节返回到eax指向的内存地址。读取到的0xC字节如下所示:00127b70 43 6f 62 6a 64 00 00 00 82 82 0000
接着程序如果读取的12字节开始4个字节不等于0x6A626F43h,则跳转到错误处理。否则执行275C89F3 cmp     [ebp+dwBytes], 8
我这里[ebp+dwBytes]0x00008282。显然0x00008282大于8,所以程序转到这里其实就是我们真正溢出的那个CALL。我们看这个call有三个参数Sub_275C876D8字节局部空间起始地址,lpMem,字节数) 【这里字节数是0x8282
跟进这个call看看,首先[Asm] 纯文本查看 复制代码275c877f 6a04         push    4275c8781 51           push    ecx275c8782 53           push    ebx275c8783 ff500c        call  dword ptr [eax+0Ch]  ole32!CExposedStream::Read (771ca84b)}读取4个字节到[ebp+var_4],返回值和0比较,如果小于0,读取失败,转到失败处理,否则[ebp+var_4][ebp+dwBytes]0x00008282比较,相等则分配0x8282字节空间,接着读取0x8282字节到刚才分配的堆空间。接着我们看到:275C87CB rep movsd  再看看此时的EDI=0x127b7cESI=0x20e008 (指向前面读取的0x8282字节)ECX=0x20a0而我们看275e7015 e8ad19feff      call   MSCOMCTL!DllGetClassObject+0x41c83 (275c89c7)
函数的返回地址是0x127b88所以这里的意思就是把从样本中读取的的0x8282字节复制0x82800x127b7c,上层函数的返回地址是0x275c8a0a。上上层函数的返回地址在0x127b88。所以275C87CB rep movsd 所在的这层函数在溢出后能正常返回,上上层函数在返回时候才跳去执行shellcode。分析完成,我们看到其实漏洞发生的根本原因在于.text:275C89F3 cmp     [ebp+dwBytes], 8.text:275C89F7 jb      loc_275D比较从样本读取过来的数据时候处理错误,这里应该是大于8个字节就转到错误处理,它写成了小于8个字节转到错误处理。而这个字节大小是我们可以控制的,所以当我们传递比如0x8282,那么程序就会读取样本相应位置可控的0x8282字节到堆空间,然后把这0x8282字节复制到0x127b7c地址,进而覆盖掉函数的返回地址,执行我们的shellcode。漏洞原因伪代码表示如下:[C] 纯文本查看 复制代码#include int main(){         sub_275C89C7();         return 0;}sub_275C89C7(){         char temp[20];  //分配20字节局部空间         Read(temp,12);  //从样本读取12字节到temp         if(temp[0]==0x6A626F43)         {                   if(temp[8]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
楼主热帖
回复

使用道具 举报

*滑块验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|12558网页游戏私服论坛 |网站地图

GMT+8, 2024-5-6 00:38 , Processed in 0.109375 second(s), 31 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表