- UID
 - 34236
 
 注册时间2007-8-13
阅读权限10
最后登录1970-1-1
周游历练 
  
 
 
 
该用户从未签到  
 | 
 
_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 |   
 
评分
- 
查看全部评分
 
 
 
 
 
 |