论坛首页 红队技术交流区 阅读主题

[原创]PWN堆unlink

194 浏览 4 回复
#1 楼主 2026-06-01 21:09:19
prev_size:记录前一个堆块的大小size:记录当前堆块的大小N、M、P:fd、bk:是俩个指针,主要用来free堆块后,free的堆块被bin管理时,形成的链表的指针。fd、bk、user_data、以及下一个prev_size:在堆块被申请之后都是用来存放用户输入的是数据这里面先使用gdb动态调试查看main_arena的结构

下面用图介绍一下main_arena并给出一些在本题中比较重要的一些东西:查看分析glibc源码,并使用图描述unlink的过程,然后具体了解unlink的检查过程Index of /gnu/glibc在该网站上找到glibc2.23,下载解压后在该目录glibc-2.23\malloc下找到malloc.c,搜索到unlink,查找到unlink这个宏定义,这段代码就是unlink的具体过程也就是说在脱链之前,也就是说他会先检查下图红线加粗的链表是否指向要脱掉的链,就可以防止双向链表的破坏。防止FD中的bk指针被修改或者BK的fd指针被修改使用heap -v指令查看堆块,现在堆块还没有被修改
然后再使用ni指令,将程序运行到free之前的一个语句接下来画图进行分析unlink的这个具体过程,首先先来说明一下unlink attack的具体条件接下来画图解释(地址就以分析1中得到的地址为准),所做的伪造堆块的前提准备是这样的已知程序在开头就已经申请了0x10个字节了,但是这个堆块并没有什么用我们需要申请3个堆块,第1个、第2个堆块尽量都申请free后能放入unsortedbin的这个链表然后第3个随便申请一个堆块就可以了(这里申请第3个堆块的原因是,防止free第二个堆块时,第二个堆块与第一个堆块合并之后再被合并入top_chunk中)这时再使用change函数修改堆块造成堆溢出,刚好具有现成的指向第一个堆块的指针(即itemlist[0].name)gdb动态调试查看,先申请一个堆块,使用x/20gx 0x6020C0查看这个结构体数组,发现该指针在0x6020c0+0x8的这个位置0x10-0001 0000

---
来源: 看雪论坛
原文链接: https://bbs.kanxue.com/thread-283956.htm
#2 2026-06-01 21:09:19
谢谢分享!
#3 2026-06-01 21:09:19
支持校友
#4 2026-06-01 21:09:19
#5 2026-06-01 21:09:19
谢谢,太厉害了

请登录后参与讨论

立即登录 注册账号