xhn1002 发表于 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 ptr8
.text:00499D06 arg_4         = dword ptr0Ch
.text:00499D06
.text:00499D06               push    ebp
.text:00499D07               mov   ebp, esp
.text:00499D09               sub   esp, 210h
.text:00499D0F               mov   eax, ; param1->eax
.text:00499D12               and   dword ptr , 0
.text:00499D15               test    eax, eax
.text:00499D17               mov   , ecx ; this指针送ebp+var4
.text:00499D1A               jz      short loc_499D8D ; 检验param1是否为空指针
.text:00499D1A
.text:00499D1C               mov   ecx, ; param2->ecx
.text:00499D1F               test    ecx, ecx
.text:00499D21               jz      short loc_499D8D
.text:00499D21
.text:00499D23               cmp   word ptr , 0 ; 这里可以看出param1是个指针
.text:00499D27               jz      short loc_499D8D ; 检验 param1是否为0(以字为单位)
.text:00499D27
.text:00499D29               and   , 0
.text:00499D30               mov   , ecx
.text:00499D36               push    ebx
.text:00499D37               lea   ecx, ; 局部对象classa
.text:00499D3D               mov   , 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,
.text:00499CAD               push    ebx             ; ecx是this指针对象有虚函数时是存放虚函数表
.text:00499CAD                                       ; 的指针 但是这个对象分析下来 没有虚函数根据后面的分析
.text:00499CAD                                       ; 里存放的是一个字符串指针
.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,     ; 一个整型变量送eax
.text:00499CB9               cmp   eax,     ; 比较eax大则跳,实际上这里的2个数 是缓冲区
.text:00499CB9                                       ; 大小的上下限,由于不能动态调试 猜eax=0
.text:00499CBC               jge   short loc_499D00
.text:00499CBC
.text:00499CBE               cmp   , si ; 以字为单位比较 串的首项是否为0
.text:00499CC2               jz      short loc_499D00
.text:00499CC2
.text:00499CC4               lea   eax, ; 这里EAX就是复制字符串的目的地址缓冲区大小就是
.text:00499CC4                                       ; -
.text:00499CC7               mov   edi, eax
.text:00499CC7
.text:00499CC9
.text:00499CC9 loc_499CC9:                           ; CODE XREF: gouzaohanshu+47j
.text:00499CC9               mov   edx,     关键   这里复制结束是以字符串的末位是否
.text:00499CCC               mov   ebx,       为20h来判定 并没有对字符串长度限制缓冲区
.text:00499CCE               mov   dx, 大小已经确定 所以这里会溢出
.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   , 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
.text:00499CEC               mov   edx,
.text:00499CEF               cmp   edx,
.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 , 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
从这个函数可以看出classa的结构
classa
{
       char* x
       int   max
       int   min(可能为0)
      chararray
       char*a(void)(溢出的函数可能是构造函数呵呵 不过是不是的关系不大)
}

--------------------------------------------------------------------------------
【版权声明】: 转载请注明作者并保持文章的完整, 谢谢!

                                                       2008年05月26日 下午 06:57:57
页: [1]
查看完整版本: 一个函数的简单静态分析