好友
阅读权限40
听众
最后登录1970-1-1
|
本帖最后由 riusksk 于 2011-12-3 20:13 编辑
【标题】:CVE-2011-1985漏洞分析与修复
【作者】:riusksk(泉哥)
【主页】:http://riusksk.blogbus.com
【时间】:2011/12/3
漏洞描述
漏洞分析
下面是系统崩溃时的栈情况:
0: kd> kp ChildEBP RetAddr ee21fd08 bf80ef2b win32k!NtUserfnINCBOXSTRING+0x8 ee21fd40 8054261c win32k!NtUserMessageCall+0xae ee21fd40 7c92e4f4 nt!KiFastCallEntry+0xfc 0012ff2c 77d194be ntdll!KiFastSystemCallRet 0012ff5c 00401015 USER32!NtUserMessageCall+0xc ……
由上我们可以知道漏洞主要发生在 win32k!NtUserfnINCBOXSTRING 这个函数里面。直接IDA加载win32k.sys 进行分析,先跟进NtUserMessageCall 函数:
消息号在0x400以内的,NtUserMessageCall函数就会去索引gapfnMessageCall函数数组中的对应函数,通过将消息号与0x3F相与运算获得函数数组索引值: 漏洞函数NtUserfnINCBOXSTRING位于函数数组索引值为0x19(win32k.sys版本不同,索引值可能会有所不同),与0x3F相与后仍为0x19,即:MessageTable[0x19] & 0x3F == 0x19 (NtUserfnINCBOXSTRING)。跟进NtUserfnINCBOXSTRING函数发现,传递的HWND参数未检测其有效性就直接引用了,导致空指针被引用: 因此当我们传递一个0xFFFFFFFF的句柄时,即可导致蓝屏:
#include void main() {
SendMessageCallback((HWND)-1,CB_ADDSTRING,0,0,0,0);
}
其它消息所导致的蓝屏,原因与此一样。
漏洞修复
通过分析打补丁后的win32k.sys,可以发现它在漏洞函数中添加了对0xFFFFFFFF参数的判断,若存在则调用UserSetLastError() 返回 -1。
|
-
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|