《Look Mom, I don’t use Shellcode》议题解析
0x0 前言
《Look Mom, I don’t use Shellcode》是2016年Syscan360上讲过的一个议题,这个议题的副标题是"Browser Exploitation Case Study for Internet Explorer 11 ",可以看出内容是关于IE11浏览器中的漏洞利用的。
非常可惜我没有能够在现场听到这个议题,但是在会后拿到了演讲者的ppt研究了一下,这里写出来也是做一个分享。
0x01 正文

这是演讲者的PPT封面

演讲者介绍漏洞的背景情况,很有意思的是本来搞这套利用是为了打16年的Pwn2Own,结果16年的Pwn2Own没有IE11的项目了(换成Edge了),然后就提交给微软的漏洞赏金项目了(也算是挽回损失了233)

js中的对象可以转让所有权,一旦转让那么对象就变成neutered状态的。

这里作者讲了js中typed array的实现,比较笼统我详细的说一下,typed array设计的本意是用来表示一些二进制数据的。因为javascript本身作为脚本语言难以方便的去“原生”的表达二进制数据的含义,所以需要typed array这一工具。typed array最早的使用方式与我们在js中常用的普通array有所不同,typed array是这么用的(其实也可以直接new)
var a= new ArrayBuffer();
var b= new Uint8Array(a);
就像作者所描述的那样,是分为解释数据类型的视图——Uint8Array对象和实际储存数据的缓冲区——ArrayBuffer对象两部分的。而且buffer不能直接访问,只能通过typed array访问。

这张就没什么好说的了

分了三步,第一步,设置一个worker。
第二步,把一个typed array的所有权交给之前创建的worker,这样这个typed array就变成neutered状态的了。
第三步,就是试图去操作这个neutered状态的typed array,结果真的可以进行写入操作,也就是存在问题。

ArrayBuffer分配在Process Heap中,而一些重要的对象则分配在custom Heap。这里的Custom Heap是自IE9之后的jscript9引擎引用的,本意是为了阻止OOB漏洞的利用把一些重点对象单独拿出来放到一个堆中不使用进程堆。这里作者说普通的Array对象、typed array(view)对象、string对象都是分配在custom Heap里的。

这里展示的是LargeHeapBlock对象的结构,之后会使用这个对象进行内存布局,这个对象分配在Process Heap中。

在某个函数中存在一个unlink的过程,可以进行DWORD SHOOT

这张图是作者进行的内存布局,我说一下这个布局是怎么来的。首先typed array是分配在Custom Heap中的,也就是图片中右面的一列。而typed array对象的ArrayBuffer对象是分配在CRT Heap中的,就是左面的那一列。首先是通过触发漏洞导致这些CRT Heap中的ArrayBuffer释放,然后使用同样会分配在CRT Heap中的LargeHeapBlock进行占位,同时利用这个对象的Pointer域(+0x8)指回到Custom Heap上。这里作者是在custom heap上创建了Arrays of integers和Arrays of typed array references两种普通的array,就像图上展示的那样。

先布置一个Integer array,然后布置一个array of typed array reference,然后放置一个被引用的typed array,最后是一个Integer array作为结尾。

这是对于一个Array对象来说,黄色的域表示目前储存的元素尺寸(item size),蓝色的域表示分配的内存尺寸(buffer size)。改大目前储存的尺寸可以实现越界读、改大分配的内存大小可以越界写。

图中说的很清楚了,因为蓝色的Integer array的length域被篡改导致可以越界读写。然后去寻找布置在两个Integer array之间的那个Typed Array,因为Typed Array存在指向ArrayBuffer的指针和size域因此可以就此实现任意地址读写。
《Look Mom, I don’t use Shellcode》议题解析的更多相关文章
- 简单物联网:外网访问内网路由器下树莓派Flask服务器
最近做一个小东西,大概过程就是想在教室,宿舍控制实验室的一些设备. 已经在树莓上搭了一个轻量的flask服务器,在实验室的路由器下,任何设备都是可以访问的:但是有一些限制条件,比如我想在宿舍控制我种花 ...
- 利用ssh反向代理以及autossh实现从外网连接内网服务器
前言 最近遇到这样一个问题,我在实验室架设了一台服务器,给师弟或者小伙伴练习Linux用,然后平时在实验室这边直接连接是没有问题的,都是内网嘛.但是回到宿舍问题出来了,使用校园网的童鞋还是能连接上,使 ...
- 外网访问内网Docker容器
外网访问内网Docker容器 本地安装了Docker容器,只能在局域网内访问,怎样从外网也能访问本地Docker容器? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Docker容器 ...
- 外网访问内网SpringBoot
外网访问内网SpringBoot 本地安装了SpringBoot,只能在局域网内访问,怎样从外网也能访问本地SpringBoot? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装Java 1 ...
- 外网访问内网Elasticsearch WEB
外网访问内网Elasticsearch WEB 本地安装了Elasticsearch,只能在局域网内访问其WEB,怎样从外网也能访问本地Elasticsearch? 本文将介绍具体的实现步骤. 1. ...
- 怎样从外网访问内网Rails
外网访问内网Rails 本地安装了Rails,只能在局域网内访问,怎样从外网也能访问本地Rails? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Rails 默认安装的Rails端口 ...
- 怎样从外网访问内网Memcached数据库
外网访问内网Memcached数据库 本地安装了Memcached数据库,只能在局域网内访问,怎样从外网也能访问本地Memcached数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装 ...
- 怎样从外网访问内网CouchDB数据库
外网访问内网CouchDB数据库 本地安装了CouchDB数据库,只能在局域网内访问,怎样从外网也能访问本地CouchDB数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Cou ...
- 怎样从外网访问内网DB2数据库
外网访问内网DB2数据库 本地安装了DB2数据库,只能在局域网内访问,怎样从外网也能访问本地DB2数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动DB2数据库 默认安装的DB2 ...
- 怎样从外网访问内网OpenLDAP数据库
外网访问内网OpenLDAP数据库 本地安装了OpenLDAP数据库,只能在局域网内访问,怎样从外网也能访问本地OpenLDAP数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动 ...
随机推荐
- maven项目无法读取src/main/java目录下的配置文件解决方法
我们在用Mybatis去操作底层数据库的时候,需要用到xml配置文件,一般我们是把配置文件和dao放置在同一层目录.但是在用idea操作maven项目的时候,我们可能会遇到无法读取到dao对应的map ...
- js写插件教程深入
原文地址:https://github.com/lianxiaozhuang/blog 转载请注明出处 js 写插件教程深入 1.介绍具有安全作用域的构造函数 function Fn(name){ t ...
- 使用doxygen静态分析开源代码
doxygen是一款生成开源代码说明文件的工具,因为不需要编译源码,用作代码的分析也十分方便. 一.安装 sudo apt-get install graphviz sudo apt-get inst ...
- Day25-博客系统
1. 搭建环境请参考:http://www.cnblogs.com/momo8238/p/7508677.html 2.创建3张表备用 models.py from django.db import ...
- 进程和线程(4)-进程 vs. 线程
进程 vs. 线程 我们介绍了多进程和多线程,这是实现多任务最常用的两种方式.现在,我们来讨论一下这两种方式的优缺点. 首先,要实现多任务,通常我们会设计Master-Worker模式,Master负 ...
- ssm框架配置过程
1.pom.xml配置 1.1<build>标签中配置<plugins>和<resources>,即插件和资源文件 1.2 <properties>标签 ...
- python 爬虫 scrapy1_官网教程
Python爬虫视频教程零基础小白到scrapy爬虫高手-轻松入门 https://item.taobao.com/item.htm?spm=a1z38n.10677092.0.0.482434a6E ...
- MySQL的备份和恢复-mysqldump
MySQL的备份和恢复-mysqldump 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.为什么需要备份 1>.做灾难恢复 天有不测风云嘛,如果你的服务器被黑客攻击了(比 ...
- Spring RedisTemplate操作-HyperLogLog操作(7)
@Autowired @Resource(name="redisTemplate") private RedisTemplate<String, String> rt; ...
- 原生JS 基础总结
0. 好习惯 分号 ; 花括号 {}, var 弄清楚 null , undefined 区别 , isNaN, === 与 == 区别 1. prompt , confirm , alert 不同框 ...