免费教程_免费网赚教程_破解版软件-寂涯网络学习基地

当前位置: 主页 > 系统综合 > 系统安全 > 利用Windows用户模式回调机制实施内核攻击(5)

利用Windows用户模式回调机制实施内核攻击(5)

时间:2012-05-05 22:02来源:未知 整理:寂涯网络 点击:


在处理各种菜单消息时,win32k在用户模式回调之后并不会校验菜单状态。特别地,通 过发送MN_ENDMENU消息关闭一个菜单时,Win32k可能大多数情况下并没有检验菜单状态是否 活跃或者相关结构体引用的对象指针是否非见)& (如弹出菜单结构体^032让! tagPOPMENU) 等。如图6所示,win32k调用xxxHandleMenuMessages消息尝试处理各种菜单消息,因为此函 数可能会调用一个回调函数,随后的操作如菜单状态指针的使用可能会引发Win32k操作一个空内存。
6.菜单状态处理引发的use-after-free漏洞
2.3缓冲区重分配
许多用户对象都包含很多元素,采用数组或者缓冲区方式形式表述。数组中的每个元素 的新增与删除通常都需调整大小以节约内存。例如,分配一个新元素若其超出或低于数组已 有的边界值,则需要重新分配一个合适大小的缓冲区。特别地是,在用户模式回调期间,任 何一个缓冲区的重分配或释放之后在内核态都必须再次校验,如图7所示。任何一个函数在 未对节点项进行校验,都有可能导致空内存操作,引发攻击者控制指定的指针实施内存污染攻击。
图7.缓冲区重分配
菜单子项数组之use-after-free漏洞,为了定位弹出或下拉的每个菜单子项,菜单对象(win32k ! tagMENU)会定义一个指向菜单子项数组的指针。每个菜单子项(win32k ! tagITEM)会为自己定义一些属性如菜单名、嵌入的图像、指向子菜单的指针等。菜单对象 结构体中citems变量定义了菜单子项数组的元素个数、变量calloces定义了已分配的缓冲区 可容纳多少个菜单子项。菜单子项数组每增加或删除一个子项,win32会调用 InsertMenuItem函数或者DeleteMenu函数,gcAlloced < cItems, win32k会尝试扩大缓冲 区大小,如图8所示。
图8.菜单子项数组重分配
Win32k提供的一些函数在用户模式回调后,并没有验证子项数组缓冲区的合法性。实际 上,当前并没有一种方式可“锁”住一个菜单子项,如用户对象,故任何一个有可能使用用 户回调的函数都有必要重新校验菜单子项数组的合法性。若菜单子项数组缓冲区在用户模式 回调机制下已经重新分配,此时随后的代码有可能会操作已释放的内存。setMenuInfo函数允许应用程序为一个特定的菜单设置多种属性。win32在对每个菜单新进行更新设置时,会 调用xxxSetMenuInfo函数遍历数组中每个菜单子项,并深层次递归更新每个子项的子菜单设 置。在递归更新菜单子项数组之前,xxxSetMenuInfo函数会将菜单子项项数(cItem)和每 个菜单子项的数组指针(rgItems)保存在局部变量/寄存器中,如下所示:
.text:BF89C779 mov eax, [esi+tagMENU. cItems]
.text:BF89C77C mov ebx, [esi+tagMENU. rgItems]
.text:BF89C77F mov [ebp+cItems], eax
.text:BF89C782 cmp eax, edx
.text:BF89C784 .iz short loc BF89C7CC
一旦xxxSetMenuInf函数已经达到最深层次菜单子项,系统将会终止递归调用。此时, 函数很可能会调用一个用户回调函数xxxMNUpdateMenumenu,故菜单子项数组就有可能会被 更新,如扩大或删除数组中的某些子项等。然而,当111_口4&1^1^慮61^函数处理完毕, 返回到递归调用处时,xxxSetMenuInfo却并没有充分校验菜单子项数组缓冲区以及数组子项 个数。若攻击者在用户模式回调处理过程中调用InsertMenuItem或DeleteMenu函数更改了菜 单子项数组,此时下面部分代码中的6匕又寄存器值就有可能指向已经释放了的内存空间。而 且,表述数组子项个数的0116肥也可能发生改变,导致xxxSetMenuInfo函数操作一个超出缓 冲区边界的item子项。
.text:BF89C786 add ebx, tagITEM. spSubMenu
.text:BF89C789 mov eax, [ebx] ; spSubMenu
.text:BF89C78B dec [ebp+cItems]
.text:BF89C78E cmp eax, edx
.text:BF89C790 jz short loc_BF89C7C4
.text:BF89C7B2 push edi   
.text:BF89C7B3 push dword ptr [ebx]   
.text:BF89C7B5 call _xxxSetMenuInfo@8  ;xxxSetMenuInfo(x, x)
.text:BF89C7BA call _ThreadUnlockl@0 ;  ThreadUnlockl()
.text:BF89C7BF xor ecx, ecx 
.text:BF89C7Cl inc ecx  
.text:BF89C7C2 xor edx, edx 
.text:BF89C7C4 add ebx, 6Ch ; next menu item 

本页地址 http://www.jybase.net/xitonganquan/20120505900.html

百度搜索更多

谷歌搜索更多

顶一下
(1)
100%
踩一下
(0)
0%
------分隔线----------------------------

评价:
昵称: 验证码:点击我更换图片
推荐内容
赞助商
赞助商


关于本站免责声明视频更新google百度地图视频地图RRS订阅

如有什么问题请在本站留言,或发邮件到 hxt167#foxmail.com