当前位置:首页 > 电脑常识 > 正文

124:微软内核整型溢露马脚 8090安适门户

11-22 电脑常识

前言
上个月我发明并呈报了一个Windows注册表整型溢露马脚,上星期二(2016.10.25)微软颁布了该缝隙的修复补丁MS16-124并对该缝隙编号CVE-2016-0070。该缝隙可以导致本地权限提升,影响到多个版本的Windows,因此微软界说为“重要更新”,并建议用户及时安置本次更新。接下来的内容中将对该缝隙的详细信息进行介绍。
缝隙复现
复现该缝隙只需要以下几步:
1. 以非打点员用户登录Windows7
2. 运行regedit.exe打开注册表编纂器
3. 选择注册表编纂器左边的“HKEY_USERS”
4. 点击菜单“文件”=>“加载配置单元”
5. 选择POC文件POC.hiv并打开
6. 在弹出框中的“键值”中输入随意字符
7. 接着你就可以看到蓝屏了,如下图

缝隙分析
该缝隙主要在解析结构的POC.hiv文件时触发,所以,我们先来瞧瞧这个文件长什么样,下图为POC.hiv文件的主要布局

正如图中标明部分所示,整型溢出产生在NKCELL布局中的ValueCount处,结构的值为0x80000001。按照本人的分析,缝隙存在于函数"CmpCheckKey"处,下面为该函数的代码片段:
PAGE:82C10E9B ; int __thiscall CmpCheckKey(int, char, int, int, ULONG_PTR BugCheckParameter3, PRTL_BITMAP BitMapHeader)
PAGE:82C10E9B _CmpCheckKey@24 proc near
PAGE:82C114C0 loc_82C114C0:     ; CODE XREF: CmpCheckKey(x,x,x,x,x,x)+60Fj
PAGE:82C114C0       mov     edx, [ebp+var_14] ; edx值为从POC偏移0x1048处获取的0x80000001
PAGE:82C114C3       shl     edx, 2 ; edx乘4,这里导致整型溢出,然后edx值变为4
PAGE:82C114C6       cmp     edx, 4
PAGE:82C114C9       jb      short loc_82C11512 ;  对照的功效为false
PAGE:82C114CB       mov     ecx, [ebp+BugCheckParameter3]
PAGE:82C114CE       mov     eax, esi
PAGE:82C114D0       call    _HvGetCellSize@8 ; HvGetCellSize(x,x)
PAGE:82C114D5       cmp     edx, eax ;  eax(0xc)与edx(4)进行对照
PAGE:82C114D7       ja      short loc_82C11512 ;  对照功效为false
PAGE:82C114D9       lea     eax, [ebp+var_C]
PAGE:82C114DC       push    eax
PAGE:82C114DD       push    [ebp+arg_4]
PAGE:82C114E0       mov     al, [edi+2]
PAGE:82C114E3       push    [ebp+var_14] ; 结构的ValueCount值0x80000001入栈
PAGE:82C114E6       shr     al, 4
PAGE:82C114E9       and     al, 1
PAGE:82C114EB       push    ecx
PAGE:82C114EC       mov     ecx, [ebp+BitMapHeader]
PAGE:82C114EF       movzx   eax, al
PAGE:82C114F2       push    eax
PAGE:82C114F3       push    esi
PAGE:82C114F4       lea     edx, [ebp+var_10]
PAGE:82C114F7       call    _CmpCheckValueList@32 ; 挪用函数触发windows内核错误查抄
PAGE:82C114FC       test    eax, eax

下面是函数“_CmpCheckValueList@32”的代码片段
PAGE:82C11F24 ; __stdcall CmpCheckValueList(x, x, x, x, x, x, x, x)
PAGE:82C11F24 _CmpCheckValueList@32 proc near
PAGE:82C17253 loc_82C17253:   ; CODE XREF: CmpCheckValueList(x,x,x,x,x,x,x,x)+32Bj
PAGE:82C17253       mov     ecx, [ebp+var_44]
PAGE:82C17256       cmp     [ecx], eax
PAGE:82C17258       jnb     short loc_82C1725C
PAGE:82C1725A       mov     [ecx], eax
PAGE:82C1725C
PAGE:82C1725C loc_82C1725C:    ; CODE XREF: CmpCheckValueList(x,x,x,x,x,x,x,x)+334j
PAGE:82C1725C       inc     [ebp+var_20] ;  [ebp+var_20]的值在第一次循环中变为1

温馨提示: 本文由杰米博客推荐,转载请保留链接: https://www.jmwww.net/file/pc/13281.html

博客主人杰米WWW
杰米博客,为大家提供seo以及it方面技巧喜欢的朋友收藏哦!
  • 11365文章总数
  • 1378074访问次数
  • 建站天数
  •