针对网页木马(CVE-2011-1260)的剖析与实际(1)

本文假设你对破绽挖掘,破绽分析,汇编这些不太了解,但是对C,C++有一定了解。首先咱们找一个具体的公开的例子——CVE-2011-1260,开释后重用破绽。首先咱们上网找一下这个破绽的POC,得到如下(运转环境XP SP3,IE8,开启DEP(稍后解释什么是DEP)):

  1. html> 
  2. body> 
  3. script language=;;> 
  4. document.body.innerHTML+="object hspace=;1000;   width=;1000;>TAG_1object>"; 
  5. document.body.innerHTML+="a id=;tag_3; style=;bottom:5000px;float:left;padding-left:-1000px;border-width:2000px;text-indent:-1000px; >TAG_3a>"; 
  6. document.body.innerHTML += "AAAAAAA"; 
  7. document.body.innerHTML+="strong style=;font-size:1000pc;margin:auto -25000px auto auto;; dir=;ltr;>TAG_11strong>"; 
  8. script> 
  9. body> 
  10. html> 

0×1 破绽分析

咱们双击打开,发现IE瓦解了,到底是什么原因呢?
咱们用windbg附加进程(调试IE最好还是用微软的调试器,毕竟微软主场):附加后,按g,回车,如果限制了activeX控件运转,就按允许,而后windbg在瓦解的时候停止了:

 

从eax+70的地点取出数据,显然这个地点不合法,以是导致错误。咱们按knL回车,从栈查看函数的挪用情况:

不清楚栈的看这里,清楚的跳过:函数挪用有很多种,这里指stdcall,在每一次挪用之前,都会将参数压栈,从右到左,比如Void A(int a,int b),汇编就类似push,push,call,Call指令会将call指令的下一条指令的地点压栈,以是最后栈看起来是这样的:(注意,压栈是从高往低压)

对应

 

以是咱们从栈中能够看出崩毁之前挪用过什么函数,以及现在在什么函数外面,函数返回地点等等很多信息。

这里咱们能够看到是在CElement::Doc函数外面崩毁,看看附近的汇编指令:

取ecx地点的内容返回给eax,但是eax是0,导致后来的内存读取错误,显然ecx出了。一般情况下,在thiscall中,第一个参数是this指针(用ecx传递),而工具+0x0h的处所储存的是虚函数表的地点,以是可得这里是取虚函数表偏移0×70的处所的虚函数指针,再挪用这个虚函数。

取ebx地点的内容给ecx,那么ebx哪里来?咱们用ida反汇编这个函数看看(在mshtml.dll)

Ebx就是this指针,即ebx指向的处所就是CTreeNode,而后CTreeNode工具+0x0h的处所传给ecx(即偏移0x0h保存了对应的CElement指针),再传入CElement::Doc。那么CTreeNode和CElement有什么关系呢?

咱们重新运转,而后定如下两个断点:

  1. bu  mshtml!CObjectElement::CreateElement+0x18 ".printf \"[%08x]\\n\",eax;g" 

在mshtml!CObjectElement::CreateElement+0×18出断下,并且打印eax的值,而后继续运转。从文字能够看出这个是构造CObjectElement的函数,外面会挪用CObjectElement的构造函数,eax一般是函数返回的值,即这个工具的指针。
 

函数中分配了一个0xDC的堆,显然这是这个工具的大小。

  1. bu  mshtml!CTreeNode::CTreeNode+0x8c ".printf \"allocated CTreeNode at %08x, ref to CElement %08x of tbale %08x\\n\", eax, poi(eax), poi(poi(eax));dds poi(eax) L 1;g" 
这个断点是在CTreeNode+0x8c处所断下,打印工具指针,对应的CElement指针(CTreeNode+0×0处保存对应CElement工具),以及对应的CElement工具的虚函数表地点。

定好断点,GO!

从图能够看出,最后创建了一个CObjectElement工具在00201c30,而后立马又创建了与之对应的CTreeNode工具0338aa18,到了程序崩毁的处所,ebx(即CTreeNode工具)还是0338aa18,但是与之对应的CObjectElement工具(ecx)却改变了。

咱们看00201c30的处所:

这里曾经不是CObjectElement的虚函数表,说明这个工具曾经被开释,以是与之对应的CTreeNode也在瓦解之前开释了,以是这里CTreeNode+0×0的CObjectElement指针也是错误的,以是指向的处所是00000000,而后读取虚函数表出错。咱们定下断点:

  1. bu  mshtml!CTreeNode::Release+0x19 ".printf \"freeing CTreeNode at %08x, CElement at %08x, of table %08x\\n\", edx, poi(edx), poi(poi(edx)); g" 

1
内容导航
 第 1 页:


转载自:https://netsecurity.51cto.com/art/201505/476423.htm

声明: 除非转自他站(如有侵权,请联系处理)外,本文采用 BY-NC-SA 协议进行授权 | 智乐兔
转载请注明:转自《针对网页木马(CVE-2011-1260)的剖析与实际(1)
本文地址:https://www.zhiletu.com/archives-4483.html
关注公众号:智乐兔

赞赏

wechat pay微信赞赏alipay pay支付宝赞赏

上一篇
下一篇

相关文章

在线留言

你必须 登录后 才能留言!

在线客服
在线客服 X

售前: 点击这里给我发消息
售后: 点击这里给我发消息

智乐兔官微