2007年5月24日星期四

[Tips]关于ani 0day的简单分析

by axis
2007-03-28
http://www.ph4nt0m.org

本来没精力跟这个漏洞了,但是今天听swan在irc里说网上的exp利用方式不够好,只覆盖了2个字节,于是下午利用了一点空闲时间跟了一下。

在我的xp sp2 cn上,全补丁,漏洞发生在以下地方

77D53A5A    8BFF            MOV EDI,EDI
77D53A5C    55              PUSH EBP
77D53A5D    8BEC            MOV EBP,ESP
77D53A5F    8B45 08         MOV EAX,DWORD PTR SS:[EBP+8]
77D53A62    8B55 10         MOV EDX,DWORD PTR SS:[EBP+10]                     ; 可以控制的长度
77D53A65    56              PUSH ESI
77D53A66    8B70 04         MOV ESI,DWORD PTR DS:[EAX+4]
77D53A69    8D0C16          LEA ECX,DWORD PTR DS:[ESI+EDX]
77D53A6C    3BCE            CMP ECX,ESI
77D53A6E    72 28           JB SHORT USER32.77D53A98
77D53A70    3BCA            CMP ECX,EDX
77D53A72    72 24           JB SHORT USER32.77D53A98
77D53A74    3B48 08         CMP ECX,DWORD PTR DS:[EAX+8]
77D53A77    77 1F           JA SHORT USER32.77D53A98
77D53A79    53              PUSH EBX
77D53A7A    57              PUSH EDI
77D53A7B    8B7D 0C         MOV EDI,DWORD PTR SS:[EBP+C]                      ; 目标buf [ebp+3c]
77D53A7E    8BCA            MOV ECX,EDX                                       ; 控制长度
77D53A80    8BD9            MOV EBX,ECX
77D53A82    C1E9 02         SHR ECX,2
77D53A85    F3:A5           REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]    ; 覆盖




拷贝发生在user32.dll中,注意这里

77D53A7B    8B7D 0C         MOV EDI,DWORD PTR SS:[EBP+C]                      ; 目标buf [ebp+3c]
77D53A7E    8BCA            MOV ECX,EDX                                       ; 控制长度
77D53A80    8BD9            MOV EBX,ECX
77D53A82    C1E9 02         SHR ECX,2
77D53A85    F3:A5           REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]    ; 覆盖



edx控制我们拷贝的长度.
edx由ani文件的0x54偏移处传入,但是由于后面有一些判断,所以要触发这个拷贝,edx不能太大。

在我的xp sp2 cn all hotfix上,edx = 0x50 正好覆盖了上层函数的ebp


由于是从[ebp+3c]开始覆盖的,所以无法在当前函数返回时控制,我们可以选择覆盖上层函数的返回地址。


由于公开的exp中只覆盖了user32.dll中的两个字节地址,这个不是很通用,所以swan会有前面那段话。


事实上,可以覆盖掉整个ebp,ebp+4,控制eip。

从codepage去找个中文的通用地址是很简单的。


而且这个dll没有/gs保护,所以利用起来很简单。


不同的平台,比如2000/2003上需要覆盖的字节可能不同。


但是这个漏洞只覆盖[ebp+4]处的2个字节,还是在user32.dll里,一般不会崩溃


但是如果把整个eip都覆盖了,如果平台差异引起了覆盖字节数不同,就会造成ie崩溃


想必这就是为什么公开的exp只覆盖2个字节,插入2个图片的原因(那两个图片的长度控制值不同,覆盖的2个字节也不同)



要查杀这个也很简单,各大AV只需要判断这个传入edx的长度是否超过了限制就可以了。






没有评论: