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. 分析windows .net程序dump文件的两种方式

    1.WinDbg 按照自己系统版本下载对应windbg(https://debugging.wellisolutions.de/windbg-versions/),win10版本自动下载文件符号,体验 ...

  2. 【mac】ansible安装及基础使用

    安装 环境释放 mac 10.12.5 #more /System/Library/CoreServices/SystemVersion.plist 安装命令 #ruby -e "$(cur ...

  3. iOS UITextfield只允许输入数字和字母,长度限制

    -(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementSt ...

  4. 【worker】js中的多线程

    因为下个项目中要用到一些倒计时的功能,所以就提前准备了一下,省的到时候出现一下界面不友好和一些其他的事情.正好趁着这个机会也加深一下html5中的多线程worker的用法和理解. Worker简介 J ...

  5. JS中数组重排序方法

    在数组中有两个可以用来直接排序的方法,分别是reverse()和sort().下面通过本文给大家详细介绍,对js数组重排序相关知识感兴趣的朋友一起看看吧 1.数组中已存在两个可直接用来重排序的方法:r ...

  6. jquery对象和DOM对象的相互转换详解

    jquery对象和DOM对象的相互转换 在讨论jquery对象和DOM对象的相互转换之前,先约定好定义变量的风格如果获取的是jquery对象,那么在变量前面加上$,例如 var $varible = ...

  7. chartControl ViewType.Bar 用法测试

    使用方法 一. Datatable : chartControl1.Series.Clear(); DataTable dt = new DataTable(); dt.Columns.Add(&qu ...

  8. JavaScript 基础(三) - Date对象,RegExp对象,Math对象,Window 对象,History 对象,Location 对象,DOM 节点

    Date对象 创建Date对象 //方法1:不指定参数 var date_obj = new Date(); alert(date_obj.toLocaleString()) //方法2:参数为日期字 ...

  9. CSS3 - @keyframes

    语法 @keyframes animationname { keyframes-selector {css-styles;} } 值 描述 animationname 必需.定义动画的名称. keyf ...

  10. angularJS中控制器和作用范围

    $scope是$rootScope的子作用域控制对象,$rootScope的id为1,其他的为2,3,4... 不同的控制器之间,所对应的作用域控制对象$scope,之间是相互隔离的,如果要共享数据, ...