0x00 前言

看k0shl大佬的SSCTF pwn450 Windows Kernel Exploitation Writeup一文,试着写一个x64下的poc。

poc地址:https://github.com/4M4Z4/cve-2016-0095-x64

0x01 环境

  • windows 7 旗舰版 Service Pack 1 64位

0x02 poc

emmm,k0shl大佬的分析文章非常好,我看了都不知道该写些啥了。那就写写我是怎么来确定那个是_SURBOJ结构体的 hDEV 为 0 的。

首先运行蓝屏poc:(将我提供的代码main函数中的NullPageAlloc函数注释掉即可)

  • windbg断下,并显示如下信息:

  • 查看发生错误的位置的汇编代码,可以发现是test byte ptr [rsi+38h],1这句汇编指令出错,下面查看一下运行这条指令时的寄存器的值

  • 查看寄存器的值,使用.cxr命令即可

    可以发现rsi为0,从而导致0地址的引用,触发内存访问错误。那么正常流程下,那个rsi+38h到底指向的是一个什么东西呢?k0shl大佬的分析文章中已经详细给出了。下面是我分析出这个东西是啥的过程,和k0shl的思路类似,但是我并没有调试,而是纯静态分析的。

  • 我们需要知道这个rsi到底是个啥:

    就是这个:[[rdx+50h]+30h] rdx是bGetRealizedBursh的第二个参数

    看了看这个rsi的取值来自bGetRealizedBursh函数的第二个参数。

    查看栈回溯如下:

  • 而bGetRealizedBrush的第二个参数来自pvGetEngRbrush(struct _BRUSHOBJ *a1)的第一个参数。

  • 而pvGetEngRbrush的第一个参数来自于EngBitBlt的倒数第3个参数,参数类型依然是_BRUSHOBJ,还是没什么信息,那么继续往上。

  • 而EngBitBlt的倒数第3个参数来自于EngPaint的第三个参数,类型依然还是_BRUSHOBJ,继续往上

  • 继续网上却发现EngPaint的第三个参数来自一个局部变量:

那么继续看看,哪儿改了这个v55,映入眼帘的就是上面那个EBURSHOBJ::vInitBrush函数,跟进去一看,就发现门路了。(其实那个v55是a1,我为了看起清楚,就改了名字,改为了v55)

  • 等于说[rdx+50]就是v21,而v21+24是一个_SURFOBJ结构体(32位的win32k.sys中的符号可以显示,但是64位不显示,不知道为啥...)。我们需要的是[[rdx+50h]+30h]的值,而[rdx+50h]+18h指向的是一个SURFOBJ,而SURFOBJ是公开的:

    typedef struct _SURFOBJ {
    DHSURF dhsurf; //v11+18h
    HSURF hsurf; //v11+20h
    DHPDEV dhpdev; //v11+28h
    HDEV hdev; //v11+30h 指向就是这个
    SIZEL sizlBitmap;
    ULONG cjBits;
    PVOID pvBits;
    PVOID pvScan0;
    LONG lDelta;
    ULONG iUniq;
    ULONG iBitmapFormat;
    USHORT iType;
    USHORT fjBitmap;
    } SURFOBJ;

    所以可知应该是hdev取为了0

0x3 总结

发现替换token是有几率蓝屏的。然后不知道该怎么解决,知道原因是因为Token值会被释放和DeReference。但是不知道怎么来解决。

发现其实好多提权exp都不太稳定额...那不是检测提权exp检测蓝屏 就可以了? emmm,倒是一种思路。

从零开始的cve分析- cve-2016-0095 简易记录的更多相关文章

  1. JDK动态代理深入理解分析并手写简易JDK动态代理(下)

    原文同步发表至个人博客[夜月归途] 原文链接:http://www.guitu18.com/se/java/2019-01-05/27.html 作者:夜月归途 出处:http://www.guitu ...

  2. JDK动态代理深入理解分析并手写简易JDK动态代理(上)

    原文同步发表至个人博客[夜月归途] 原文链接:http://www.guitu18.com/se/java/2019-01-03/27.html 作者:夜月归途 出处:http://www.guitu ...

  3. Microsoft Build 2016 Day 2 记录(多图慎入)

    Microsoft Build 2016 Day 1 记录 Microsoft Build 2016 进行到了第二天,我觉得这一天的内容非常精彩,因为主要和开发者相关

  4. 分析jQuery源码时记录的一点感悟

    分析jQuery源码时记录的一点感悟      1.  链式写法      这是jQuery语法上的最大特色,也许该改改POJO里的set方法,和其他的非get方法什么的,可以把多行代码合并,减去每次 ...

  5. 图书馆管理系统程序+全套开发文档(系统计划书,系统使用说明,测试报告,UML分析与设计,工作记录)

    图书馆管理系统程序+全套开发文档(系统计划书,系统使用说明,测试报告,UML分析与设计,工作记录): https://download.csdn.net/download/qq_39932172/11 ...

  6. java string 细节原理分析(2016.5)

    看到了以前2016.5月学习java写的笔记,这里放在一起. String实现的细节原理分析 一.jdk源码中String 的实现 public final class String implemen ...

  7. Vue源码分析之实现一个简易版的Vue

    目标 参考 https://cn.vuejs.org/v2/guide/reactivity.html 使用 Typescript 编写简易版的 vue 实现数据的响应式和基本的视图渲染,以及双向绑定 ...

  8. 从零开始山寨Caffe·伍:Protocol Buffer简易指南

    你为Class外访问private对象而苦恼嘛?你为设计序列化格式而头疼嘛? ——欢迎体验Google Protocol Buffer 面向对象之封装性 历史遗留问题 面向对象中最矛盾的一个特性,就是 ...

  9. ruby 分析日志,提取特定记录

    读取日志中的每一行,分析后存入hash,然后做累加 adx_openx=Hash.new(0) File.open('watch.log.2016-08-24-21').each do |line| ...

随机推荐

  1. Perl解除引用:从引用还原到数据对象

    使用引用可以指向数据对象,这似乎很简单. @name1=qw(longshuai wugui); @name2=qw(xiaofang tuner); $ref_name=\@name1; push ...

  2. centos7+cobbler+kickstart

    一.cobbler简介 cobbler 是一个系统启动服务boot server,可以通过pxe得方式用来快速安装,重装系统,支持安装不同linux发行版和windows.这个工具是用python开发 ...

  3. Spring Cloud Stream消费失败后的处理策略(四):重新入队(RabbitMQ)

    应用场景 之前我们已经通过<Spring Cloud Stream消费失败后的处理策略(一):自动重试>一文介绍了Spring Cloud Stream默认的消息重试功能.本文将介绍Rab ...

  4. YTKNetwork网络封装

    本篇是答应在端午写iOS网络-四篇源码解析以及封装的最后一篇,是针对上一篇YTKNetwork源码解析后的一次封装,也是自己实际项目中所使用过的.在对YTKNetwork封装的时候,还是需要对YTKN ...

  5. HBuilder + PHP开发环境配置

      HBuilder 集成开发环境简介 HBuilder是DCloud(数字天堂)推出的一款支持HTML5的Web开发IDE.HBuilder的编写用到了Java.C.Web和Ruby.HBuilde ...

  6. 网上看到一份详细sql游标说明 《转载 https://www.cnblogs.com/xiongzaiqiren/p/sql-cursor.html》

     SQL游标(cursor)详细说明及内部循环使用示例 游标 游标(cursor)是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果.每个游标区都有一个名字,用户可以用SQL语句逐一从游标中获 ...

  7. 【转载】 C#往文件中追加文本内容信息

    在C#的文件相关操作中,往已有的文件中追加相关内容信息也是常有的操作,例如我们在写网站日志文件的时候,很多时候是1天的日志存放在一个txt文件中,此时就涉及到往原有文件中追加写入文本内容信息,追加文本 ...

  8. Python在Office 365 开发中的应用

    我在昨天发布的文章 -- 简明 Python 教程:人生苦短,快用Python -- 中提到了Python已经在Office 365开发中全面受支持,有不同朋友留言或私信说想了解更加详细的说明,所以特 ...

  9. Hibernate(十四)抓取策略

    抓取策略: 抓取策略是当应用程序需要在(Hibernate实体对象图的)关联关系间进行导航的时候,Hibernate如何获取关联对象的策略.Hibernate的抓取策略是Hibernate提升性能的一 ...

  10. JAVA面试题(8)

    java基础以及多个“比较” 1.Collections.sort排序内部原理 在Java 6中Arrays.sort()和Collections.sort()使用的是MergeSort,而在Java ...