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》议题解析的更多相关文章

  1. 简单物联网:外网访问内网路由器下树莓派Flask服务器

    最近做一个小东西,大概过程就是想在教室,宿舍控制实验室的一些设备. 已经在树莓上搭了一个轻量的flask服务器,在实验室的路由器下,任何设备都是可以访问的:但是有一些限制条件,比如我想在宿舍控制我种花 ...

  2. 利用ssh反向代理以及autossh实现从外网连接内网服务器

    前言 最近遇到这样一个问题,我在实验室架设了一台服务器,给师弟或者小伙伴练习Linux用,然后平时在实验室这边直接连接是没有问题的,都是内网嘛.但是回到宿舍问题出来了,使用校园网的童鞋还是能连接上,使 ...

  3. 外网访问内网Docker容器

    外网访问内网Docker容器 本地安装了Docker容器,只能在局域网内访问,怎样从外网也能访问本地Docker容器? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Docker容器 ...

  4. 外网访问内网SpringBoot

    外网访问内网SpringBoot 本地安装了SpringBoot,只能在局域网内访问,怎样从外网也能访问本地SpringBoot? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装Java 1 ...

  5. 外网访问内网Elasticsearch WEB

    外网访问内网Elasticsearch WEB 本地安装了Elasticsearch,只能在局域网内访问其WEB,怎样从外网也能访问本地Elasticsearch? 本文将介绍具体的实现步骤. 1. ...

  6. 怎样从外网访问内网Rails

    外网访问内网Rails 本地安装了Rails,只能在局域网内访问,怎样从外网也能访问本地Rails? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Rails 默认安装的Rails端口 ...

  7. 怎样从外网访问内网Memcached数据库

    外网访问内网Memcached数据库 本地安装了Memcached数据库,只能在局域网内访问,怎样从外网也能访问本地Memcached数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装 ...

  8. 怎样从外网访问内网CouchDB数据库

    外网访问内网CouchDB数据库 本地安装了CouchDB数据库,只能在局域网内访问,怎样从外网也能访问本地CouchDB数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Cou ...

  9. 怎样从外网访问内网DB2数据库

    外网访问内网DB2数据库 本地安装了DB2数据库,只能在局域网内访问,怎样从外网也能访问本地DB2数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动DB2数据库 默认安装的DB2 ...

  10. 怎样从外网访问内网OpenLDAP数据库

    外网访问内网OpenLDAP数据库 本地安装了OpenLDAP数据库,只能在局域网内访问,怎样从外网也能访问本地OpenLDAP数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动 ...

随机推荐

  1. MyBatis中Mapper的返回值类型

    insert.update.delete语句的返回值类型 对数据库执行修改操作时,数据库会返回受影响的行数. 在MyBatis(使用版本3.4.6,早期版本不支持)中insert.update.del ...

  2. ubuntu 16.04 kdump 使用

    1.安装linux-crashdump及kdump sudo apt-get install linux-crashdump sudo apt-get install kexec-tool 2.重启电 ...

  3. SPOJ DQUERY - D-query (莫队算法|主席树|离线树状数组)

    DQUERY - D-query Given a sequence of n numbers a1, a2, ..., an and a number of d-queries. A d-query ...

  4. MT【84】夹逼定值

    分析:此类题还是比较常见的,左右都有不等式,中间夹着一个式子,我们可以找个$x$使得中间式子满足的条件显示出来. 类似的方法可以用在这道浙江高考文科压轴题上

  5. 【刷题】BZOJ 4078 [Wf2014]Metal Processing Plant

    Description 定义集合S的价值D(S)为: 现在给你n个元素,并给出其中任意两个元素之间的d(i,j)值 要你将这些元素划分成两个集合A.B. 求min{D(A)+D(B)}. 注:d(i, ...

  6. 【刷题】LOJ 6001 「网络流 24 题」太空飞行计划

    题目描述 W 教授正在为国家航天中心计划一系列的太空飞行.每次太空飞行可进行一系列商业性实验而获取利润.现已确定了一个可供选择的实验集合 \(E = \{ E_1, E_2, \cdots, E_m ...

  7. 洛谷P1450 [HAOI2008]硬币购物(背包问题,容斥原理)

    洛谷题目传送门 我实在是太弱了,第一次正儿八经写背包DP,第一次领会如此巧妙的容斥原理的应用...... 对每次询问都做一遍多重背包,显然T飞,就不考虑了 关键就在于每次询问如何利用重复的信息 我这么 ...

  8. [学习笔记]nim游戏

    普通nim游戏: n堆石子,每个人每次对着一堆拿若干个.不能拿者判输. 只有两种情况,先手必胜,先手必败. 先手必胜当且仅当:a1^a2^...^an!=0 证明: 设=x(x不为0),选择最高位和x ...

  9. Linux下使用cron让Python程序持久化运行

    正常情况下,一个python程序如果希望实现一直运行,不出错不奔溃是很难的,即使编译为可持续文件也是一样 幸运的是很多需求并不是需要24小时不间断运行,而是每隔一段时间运行一次即可 Linux系统自带 ...

  10. 解决提交按钮在IE浏览器正常在360浏览器不可用

    用meta标签指定使用哪个浏览器内核解析网页.在页面头部head标签里加上下面的代码即可:<meta name="renderer" content="webkit ...