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

且行且记录

点滴记录,行的更远!

 
 
 

日志

 
 

简单分析一下CVE-2013-3918  

2014-08-19 16:55:44|  分类: 原理分析 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

下午调试了一下CVE-2013-3918,其实从脚本可以大概看出,是偏移计算错误,

实际上是偏移与长度比较错误,导致长度计算溢出的。

导致问题主要在remove方法里面:

//remove

003D9D01 cmp     word ptr [ebx], 3
003D9D05 jnz     003D9D8C
003D9D0B mov     edi, dword ptr [ebx+8]           ;  输入的索引
003D9D0E cmp     edi, dword ptr [esi+8]           ;  保存的长度
003D9D11 ja      003D9DC9 <============;  无符号比较,这里允许索引小于等于长度!这里其实应该 jnb xxxx
003D9D17 mov     eax, dword ptr [ebp-8]
003D9D1A push    dword ptr [eax+edi*4]
003D9D1D call    dword ptr [<&OLEAUT32.#6>]       ;  OLEAUT32.SysFreeString
003D9D23 mov     eax, dword ptr [esi+8]
003D9D26 lea     ecx, dword ptr [eax-1] 这里长度等于零呢?计算就错了
003D9D29 cmp     edi, ecx
003D9D2B je      short 003D9D46
003D9D2D mov     ecx, dword ptr [ebp-8]
003D9D30 sub     eax, edi
003D9D32 shl     eax, 2
003D9D35 lea     ecx, dword ptr [ecx+edi*4]
003D9D38 push    eax                              ; /n
003D9D39 lea     eax, dword ptr [ecx+4]           ; |
003D9D3C push    eax                              ; |src
003D9D3D push    ecx                              ; |dest
003D9D3E call    <jmp.&msvcrt.memcpy>             ; \memcpy
003D9D43 add     esp, 0C
003D9D46 dec     dword ptr [esi+8]                ;  这里长度减少1,如果上面到这里,满足条件长度大于零,才允许减1操作!
003D9D49 mov     esi, dword ptr [esi+8]
003D9D4C mov     eax, dword ptr [ebp-8]
003D9D4F and     dword ptr [eax+esi*4], 0
003D9D53 xor     esi, esi

函数里面允许 0 ≤ index ≤ len ,导致len = 0 , index = 0 时,len = 0xffffffff,扩大了范围

之后继续用index = len ,使 len 减小。。。

最后在用add方法修改,

//add

003D9C4F xor     ebx, ebx
003D9C51 push    dword ptr [edi+8]
003D9C54 call    dword ptr [<&OLEAUT32.#2>]       ;  OLEAUT32.SysAllocString
003D9C5A mov     ecx, dword ptr [esi+8]           ;  索引
003D9C5D mov     edx, dword ptr [ebp-8]           ;  基址
003D9C60 mov     dword ptr [edx+ecx*4], eax       ;  添加内容
003D9C63 inc     dword ptr [esi+8]

因为前面索引和长度比较问题导致长度下溢出变成了很大的长度,所以访问范围扩大了,就可以按要求修改内存。

精心构造对象就可以达到利用的目的了。

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

历史上的今天

在LOFTER的更多文章

评论

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

页脚

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