关于ani 0day的简单分析

来源:Ph4nt0m Security Team

by axis
2007-03-28

本来没精力跟这个漏洞了,但是今天听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的长度是否超过了限制就可以了。

相关日志

发表评论