从零开始的cve分析- cve-2016-0095 简易记录
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 简易记录的更多相关文章
- JDK动态代理深入理解分析并手写简易JDK动态代理(下)
原文同步发表至个人博客[夜月归途] 原文链接:http://www.guitu18.com/se/java/2019-01-05/27.html 作者:夜月归途 出处:http://www.guitu ...
- JDK动态代理深入理解分析并手写简易JDK动态代理(上)
原文同步发表至个人博客[夜月归途] 原文链接:http://www.guitu18.com/se/java/2019-01-03/27.html 作者:夜月归途 出处:http://www.guitu ...
- Microsoft Build 2016 Day 2 记录(多图慎入)
Microsoft Build 2016 Day 1 记录 Microsoft Build 2016 进行到了第二天,我觉得这一天的内容非常精彩,因为主要和开发者相关
- 分析jQuery源码时记录的一点感悟
分析jQuery源码时记录的一点感悟 1. 链式写法 这是jQuery语法上的最大特色,也许该改改POJO里的set方法,和其他的非get方法什么的,可以把多行代码合并,减去每次 ...
- 图书馆管理系统程序+全套开发文档(系统计划书,系统使用说明,测试报告,UML分析与设计,工作记录)
图书馆管理系统程序+全套开发文档(系统计划书,系统使用说明,测试报告,UML分析与设计,工作记录): https://download.csdn.net/download/qq_39932172/11 ...
- java string 细节原理分析(2016.5)
看到了以前2016.5月学习java写的笔记,这里放在一起. String实现的细节原理分析 一.jdk源码中String 的实现 public final class String implemen ...
- Vue源码分析之实现一个简易版的Vue
目标 参考 https://cn.vuejs.org/v2/guide/reactivity.html 使用 Typescript 编写简易版的 vue 实现数据的响应式和基本的视图渲染,以及双向绑定 ...
- 从零开始山寨Caffe·伍:Protocol Buffer简易指南
你为Class外访问private对象而苦恼嘛?你为设计序列化格式而头疼嘛? ——欢迎体验Google Protocol Buffer 面向对象之封装性 历史遗留问题 面向对象中最矛盾的一个特性,就是 ...
- ruby 分析日志,提取特定记录
读取日志中的每一行,分析后存入hash,然后做累加 adx_openx=Hash.new(0) File.open('watch.log.2016-08-24-21').each do |line| ...
随机推荐
- jdk中的简单并发,需要掌握
前言 开心一刻 小时候有一次爸爸带我去偷村头别人家的梨子,我上树摘,爸爸在下面放风,正摘着主人来了,爸爸指着我破口大骂:臭小子,赶紧给我滚下来,敢偷吃别人家梨子,看我不打死你.主人家赶紧说:没事没事, ...
- 【SqlServer系列】远程访问
1 概述 已发布[SqlServer系列]文章如下: [SqlServer系列]SQLSERVER安装教程 [SqlServer系列]数据库三大范式 [SqlServer系列]表单查询 [SqlS ...
- JQuery Dom的基本操作
这是赋值 $("#test").val ("aaa"); 这是取值 string s = $("#test").val (); text( ...
- C#中MessageBox.Show问题(让提示窗口不显示在任务栏中)
在winform中让MessageBox.Show显示的窗口不显示在任务栏中:第一个参数很明显是你要显示的内容 类型是string 语法Visual Basic(声明) Public Shared ...
- [android] 采用post的方式提交数据
GET:内部实现是组拼Url的方式,http协议规定最大长度4kb,ie浏览器限制1kb POST和GET的区别比较了一下,多了几条信息 Content-Type:application/x-www- ...
- 微信小程序实现支付功能
小程序支付,没有封装支付代码:直接上一段可用的流程代码吧:微信小程序支付官网文档有详细的说明,这里我就不再赘述啦:客户端js: wx.request({ url:'https://www.xxxx.c ...
- Maven(五)Eclipse配置Maven插件
较新版本的Eclipse内置Maven插件 1. 设置installation 一般不适用内置的 指定核心程序的位置 2. 设置user settings 指定本地仓库的位置 1.如果setting. ...
- A simple problem(湘大邀请赛)
A simple problem Accepted : 61 Submit : 418 Time Limit : 15000 MS Memory Limit : 655360 KB Probl ...
- BootStrapTable 错误
异常:Cannot read property 'field' of undefined 场景:使用BootStrapTable展示数据时,控制台报错 解决:给table加上 thead 和 tbod ...
- 字符串方法之padStart和padEnd
ECMAScript 2017 有两个新的字符串方法:padStart和padEnd; 很有用啊啊,不用写if判断啦!开心脸 padStart在字符串开始出填充,padStart(num,‘要填充的 ...