专栏首页Gcow安全团队因为你安全了,所以你危险了——空指针引用

因为你安全了,所以你危险了——空指针引用

因为你安全了,所以你危险了——空指针引用

1.本文章属于系列文章《因为你安全了,所以你危险了》中的第一篇 2.本篇文章的作者是Gcow安全团队复眼小组的晏子霜,未经允许禁止转载 3.本篇文章需要你对GDI子系统有一定了解,最好阅读过部分关于Windows显示驱动,打印机驱动,以及调色板这一块的源码.并对DDI函数有一定了解,以及编写Windows Kernel Exploit的能力 (故对一些不涉及这领域或者刚刚入门这一领域的看官会有点吃力) 4.本篇文章一共1300字,图11张 预计阅读时间9分钟 5.该文章仅逆向ulAnimatePalette函数,但同样的思路在老版本Windows中可挖掘到多个空指针引用漏洞,均为Nday(不过修复也是一次性修复完毕)

0x00 前言

Windows Vista的时候,微软将打印机驱动从内核态移动到了用户态,这样可以解决相当一部分打印机驱动导致的漏洞,因为第三方开发的驱动的安全性有待提高.

这样做好处的显而易见的,减少了许多第三方开发的打印机驱动的漏洞,但是也带来了弊端,通过Hook图形设备驱动接口Or打印机驱动接口,为安全研究员们扩展了一个新的攻击面,这就有些得不偿失了.

因此本系列文章将从简入深的讲解多个由安全性提高转化成安全性”降低”的多个漏洞,其中包含但不限于(空指针引用,内存越界读写)

0x01 图形驱动

创建图形驱动程序必须要创建的函数如下

这些函数是必须要创建的,如果为空,则在内核中创建对象不可能成功.

通过CreateDC 指定名称可以创建一个关于打印机设备的上下文环境,我们阅读源码后发现他会回调打印机DDI函数中的DrvEnablePDEV,并传递了多个重要数据结构,我们可以Hook DrvEnablePDEV函数来修改函数执行过后的结果,当其返回内核时,我们即可控制函数的执行流程了.

不过在早期的Windows 中,安全性并没有现在这么高,很多安全保护都是不存在的,就比如说禁止用户态从0页分配内存,我们就可以利用他来达到本地权限提升的目的.

GreAnimatePalette函数分析

AnimatePalette函数置换指定逻辑调色板中的颜色项,在Win32k中该函数调用了实现函数XEPALOBJ::ulAnimatePalette来实现功能.

但是在早期的Windows7中,该函数存在空指针引用漏洞,利用该漏洞我们可以达到本地权限提升的目的.

我们可以使用用户态包装好的AnimatePalette函数来调用到GreAnimatePalette函数或者从ShaDownSSDT中搜素编号调用NtGdiDoPalette函数都可以执行到XEPALOBJ::ulAnimatePalette.

由于该函数是XEPALOBJ类中的函数,所以存在一个This指针,通常为ecx,此处也是一样,ecx保存着指向PALETTE结构的指针.

该函数首先判断了传入的iStart是否大于颜色项的总个数,如果大于则结束函数

接着判断iStart+ cEntry 是否大于cEntries,如果大于则将cEntry设置为cEntries-iStart.

判断是否为某个DC中的调色板,判断Palette.cRefhpal是否存在,不存在则跳出循环.

判断Palete->GdiInfo.flRaster & RC_PALETTE是否为真,如果为假,则跳出循环.

最后判断 Palete->ptransCurrent是否存在,如果不存在则跳出循环,存在则初始化两个局部变量,一个指向Palete->ptransCurrent,另外一个指向Palete->ptransCurrent->ajVector[iStart].

下面是个循环,大致意思就是从函数的第三个参数(ppalSrc)复制内容到Palette.pFirstColor[iStart]中,并且判断Palete->ptransCurrent是否为真,如果为真则读取Palete->ptransCurrent->ajVector[iStart]处的内容当作偏移,来写入到palSurf.pFirstColor[Palete->ptransCurrent->ajVector[iStart]]中.(写入内容为*ppalSrc)

结束循环后,函数会再次判断Palete->ptransCurrent 是否存在,Palete->GdiInfo.flRaster & RC_PALETTE是否为真以及判断Palete->fs& PDEV_DISABLED是否为假,如果为False,则会从PEDV->apfn[]表中寻找需要的函数函数并跳转执行.

是不是很熟悉PPFNDRV,这个上文是不是回调过DrvEnablePDEV,这里是要回调DrvSetPalette吗?

理论上来说是的,但是实际上来说,上文保存了一个必须创建图形驱动程序必须要创建的函数表,其中并没有DrvSetPalette,因为这个函数是可选的.

  • 问题来了,如果不存在这个函数,但是函数调用了他,会出现什么问题呢?
  • 答对了,空指针引用,在老版本Windows中并没有对函数指针是否正确进行验证,所以如果函数指针指向0,依然会Call过去,这样就造成了一个空指针引用的漏洞,我们只要在0处申请内存,填充代码,在同一进程上下文中即可触发该引用,让操作系统执行我们的代码.

本文分享自微信公众号 - Gcow安全团队(Gcow666),作者:复眼小组

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-03-26

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 代码审计之DTCMS V5.0后台漏洞两枚

    Gcow安全团队
  • 潜藏在PHP安全的边缘——浅谈PHP反序列化漏洞

    最近在研究代码审计漏洞的时候,特别注意了一下PHP反序列化漏洞,该漏洞又被成为PHP对象注入,个人感觉比较有意思,所以通过通俗易懂的语言来简单说一下PHP反序列...

    Gcow安全团队
  • 智能合约安全审计之路-整数溢出漏洞

    描述:变量在参与运算的过程中,运算结果超出了变量类型所能表示的范围,导致实际存储的计算结果出错

    Gcow安全团队
  • 逻辑回归模型及Python实现

    1.模型 在分类问题中,比如判断邮件是否为垃圾邮件,判断肿瘤是否为阳性,目标变量是离散的,只有两种取值,通常会编码为0和1。假设我们有一个特征X,画出散点图,结...

    企鹅号小编
  • 查找git ignore的追踪

    前言 版本控制说简单也简单,说复杂也困难的多。作为开发者,最基础的版本管理和团队协作的功能必须掌握。而其他一些相关的信息也可以了解下。比如,这次就有同事遇到了问...

    Ryan-Miao
  • 九年创业老兵的感悟:一场以终为始的马拉松

    它不是古希腊神话中虚无缥缈的大地女神,它是创业洪流中已经9岁的“老兵”。静谧的寒山寺,精美的拙政园是它附近的风景,它就是劳动力管理领域搞得定的盖雅工场(Gaia...

    人称T客
  • sublime text 3启动报错"swallow_startup_errors"解决方法

    首选项 -- package settings -- Anaconda -- settings-user,

    流柯
  • 打造运维大脑:翼支付高速发展背后,甜橙金融的云化智能演进

    不久前,在由ACOUG与云和恩墨主办的2018数据技术嘉年华的金融科技实战分论坛上,甜橙金融分享了其云化变革的成功经验。

    数据和云
  • 一天一点命令行之 less

    Linux命令行界面通常会使用 cat 、 less 和 more 三个命令来查看文件内容。

    阿凡亮
  • 社交媒体分析:洞察希拉里面对的性别歧视

    大数据文摘

扫码关注云+社区

领取腾讯云代金券