一个函数的简单静态分析
_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]