- 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 |
评分
-
查看全部评分
|