飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 4074|回复: 0

[原创] 一个函数的简单静态分析

[复制链接]

该用户从未签到

发表于 2008-5-26 19:17:44 | 显示全部楼层 |阅读模式
_IE5_SHADETYPE_TEXT::Text(unsigned short const *, int)这个函数有个 几年前的漏洞
ODAY这本并没有 详细的分析  偏偏书上用作例子的HTML文件 在我机器上 不能正常工作
只能静态分析了,由于是在未联网的虚拟机里分析的  且未用最新的IDA 所以不能识别函数的名称
下面的sub_499D06就是_IE5_SHADETYPE_TEXT::Text(系统是雨木林风的WIN2000SP4)
【详细过程】
  .text:00499D06 sub_499D06      proc near               ; CODE XREF: sub_46C00E+9Ep
  .text:00499D06
  .text:00499D06 var_210         = dword ptr -210h
  .text:00499D06 var_20C         = dword ptr -20Ch
  .text:00499D06 var_208         = dword ptr -208h
  .text:00499D06 var_4           = dword ptr -4
  .text:00499D06 arg_0           = dword ptr  8
  .text:00499D06 arg_4           = dword ptr  0Ch
  .text:00499D06
  .text:00499D06                 push    ebp
  .text:00499D07                 mov     ebp, esp
  .text:00499D09                 sub     esp, 210h
  .text:00499D0F                 mov     eax, [ebp+arg_0] ; param1->eax
  .text:00499D12                 and     dword ptr [ecx], 0
  .text:00499D15                 test    eax, eax
  .text:00499D17                 mov     [ebp+var_4], ecx ; this指针送ebp+var4
  .text:00499D1A                 jz      short loc_499D8D ; 检验param1是否为空指针
  .text:00499D1A
  .text:00499D1C                 mov     ecx, [ebp+arg_4] ; param2->ecx
  .text:00499D1F                 test    ecx, ecx
  .text:00499D21                 jz      short loc_499D8D
  .text:00499D21
  .text:00499D23                 cmp     word ptr [eax], 0 ; 这里可以看出param1是个指针
  .text:00499D27                 jz      short loc_499D8D ; 检验 param1[0]是否为0(以字为单位)
  .text:00499D27
  .text:00499D29                 and     [ebp+var_208], 0
  .text:00499D30                 mov     [ebp+var_20C], ecx
  .text:00499D36                 push    ebx
  .text:00499D37                 lea     ecx, [ebp+var_210] ; 局部对象class  a
  .text:00499D3D                 mov     [ebp+var_210], eax ; param1->ebp+var_210
  .text:00499D43                 xor     ebx, ebx
  .text:00499D45                 call    gouzaohanshu    ;看起来很象 局部对象的构造函数,复制字符串 返回array
                                                           溢出就在这个函数里
  .text:00499D45                                         ;
  .text:00499D45
  .text:00499D4A                 test    eax, eax
  .text:00499D4C                 jz      short loc_499D83
  .text:00499D4C
  .text:00499D4E                 push    esi
  以下代码略
  =======================================================
  .text:00499CAB gouzaohanshu    proc near               ; CODE XREF: sub_499D06+3Fp
  .text:00499CAB                                         ; sub_499D06+64p
  .text:00499CAB                 mov     edx, [ecx]
  .text:00499CAD                 push    ebx             ; ecx是this指针  对象有虚函数时[ecx]是存放虚函数表
  .text:00499CAD                                         ; 的指针 但是这个对象分析下来 没有虚函数根据后面的分析
  .text:00499CAD                                         ; [ecx]里存放的是一个字符串指针
  .text:00499CAE                 push    esi
  .text:00499CAF                 xor     esi, esi
  .text:00499CB1                 cmp     edx, esi        ; 检验 串指针是否有效
  .text:00499CB3                 push    edi
  .text:00499CB4                 jz      short loc_499D00 ; 指针无效则跳
  .text:00499CB4
  .text:00499CB6                 mov     eax, [ecx+8]    ; 一个整型变量送eax
  .text:00499CB9                 cmp     eax, [ecx+4]    ; 比较  eax大则跳,实际上这里的2个数 是缓冲区
  .text:00499CB9                                         ; 大小的上下限,由于不能动态调试 猜eax=0
  .text:00499CBC                 jge     short loc_499D00
  .text:00499CBC
  .text:00499CBE                 cmp     [edx+eax*2], si ; 以字为单位比较 串的首项是否为0
  .text:00499CC2                 jz      short loc_499D00
  .text:00499CC2
  .text:00499CC4                 lea     eax, [ecx+0Ch]  ; 这里EAX就是复制字符串的目的地址缓冲区大小就是
  .text:00499CC4                                         ; [ecx+04]-[ecx+08]
  .text:00499CC7                 mov     edi, eax
  .text:00499CC7
  .text:00499CC9
  .text:00499CC9 loc_499CC9:                             ; CODE XREF: gouzaohanshu+47j
  .text:00499CC9                 mov     edx, [ecx+8]    关键   这里复制结束是以字符串的末位是否
  .text:00499CCC                 mov     ebx, [ecx]      为20h来判定 并没有对字符串长度限制  缓冲区
  .text:00499CCE                 mov     dx, [ebx+edx*2]  大小已经确定 所以这里会溢出
  .text:00499CD2                 test    dx, dx
  .text:00499CD5                 jz      short loc_499CF4
  .text:00499CD5
  .text:00499CD7                 cmp     dx, 20h
  .text:00499CDB                 jnz     short loc_499CE3
  .text:00499CDB
  .text:00499CDD                 test    esi, esi
  .text:00499CDF                 jg      short loc_499CF8
  .text:00499CDF
  .text:00499CE1                 jmp     short loc_499CE9
  .text:00499CE1
  .text:00499CE3 ; ---------------------------------------------------------------------------
  .text:00499CE3
  .text:00499CE3 loc_499CE3:                             ; CODE XREF: gouzaohanshu+30j
  .text:00499CE3                 mov     [edi], dx
  .text:00499CE6                 inc     esi             ;ESI返回值是 串长(UNICODE长度)
  .text:00499CE7                 inc     edi
  .text:00499CE8                 inc     edi
  .text:00499CE8
  .text:00499CE9
  .text:00499CE9 loc_499CE9:                             ; CODE XREF: gouzaohanshu+36j
  .text:00499CE9                 inc     dword ptr [ecx+8]
  .text:00499CEC                 mov     edx, [ecx+8]
  .text:00499CEF                 cmp     edx, [ecx+4]
  .text:00499CF2                 jl      short loc_499CC9
  .text:00499CF2
  .text:00499CF4
  .text:00499CF4 loc_499CF4:                             ; CODE XREF: gouzaohanshu+2Aj
  .text:00499CF4                 test    esi, esi
  .text:00499CF6                 jle     short loc_499D00
  .text:00499CF6
  .text:00499CF8
  .text:00499CF8 loc_499CF8:                             ; CODE XREF: gouzaohanshu+34j
  .text:00499CF8                 and     word ptr [ecx+esi*2+0Ch], 0
  .text:00499CFE                 jmp     short loc_499D02
  .text:00499CFE
  .text:00499D00 ; ---------------------------------------------------------------------------
  .text:00499D00
  .text:00499D00 loc_499D00:                             ; CODE XREF: gouzaohanshu+9j
  .text:00499D00                                         ; gouzaohanshu+11j
  .text:00499D00                                         ; gouzaohanshu+17j
  .text:00499D00                                         ; gouzaohanshu+4Bj
  .text:00499D00                 xor     eax, eax
  .text:00499D00
  .text:00499D02
  .text:00499D02 loc_499D02:                             ; CODE XREF: gouzaohanshu+53j
  .text:00499D02                 pop     edi
  .text:00499D03                 pop     esi
  .text:00499D04                 pop     ebx
  .text:00499D05                 retn
  .text:00499D05
  .text:00499D05 gouzaohanshu    endp
  .text:00499D05
  从这个函数可以看出class  a的结构
  class  a
  {
       char* x
       int   max
       int   min(可能为0)
        char  array[max]
       char*  a(void)(溢出的函数可能是构造函数呵呵 不过是不是的关系不大)
  }
  
--------------------------------------------------------------------------------
【版权声明】: 转载请注明作者并保持文章的完整, 谢谢!

                                                       2008年05月26日 下午 06:57:57

评分

参与人数 1威望 +40 飘云币 +40 收起 理由
hj2008mt + 40 + 40 PYG有你更精彩!

查看全部评分

PYG19周年生日快乐!
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

快速回复 返回顶部 返回列表