首页
社区
课程
招聘
[原创]PWN学习笔记【堆】【unlink】
发表于: 2022-6-23 12:31 21558

[原创]PWN学习笔记【堆】【unlink】

2022-6-23 12:31
21558

chunk结构体大致如下

size的低三位表示为:

这里会用到  PREV_INUSE(P): 表示前一个chunk是否为allocated。


P位为1时代表物理相邻的前一个chunk为free状态,此时prev_size代表前一个chunk的大小

非fastbin的chunk在free时会与物理相邻的空闲chunk合并


非fastbin中的chunk使用的是双向链表,使用chunk的fd、bk链接

设需要unlink的指针为P,在unlink时,进行如下操作:

高版本的libc会检测BK和FD的指针是否指向P:


伪造一个fake_chunk,绕过unlink的检测,即可任意地址写


1.设有相邻的两块chunk,p,f,使得f,free后不进入fastbin(chunk size>0x80)

2.在p中创建一个伪造chunk块fake_chunk,使p->Fd= &p-3*sizeof(size_t);p->bK= &p-2*sizeof(size_t)

3.修改f的chunk头,使prev_size=fake_chunk_size, PREV_INUSE = 0

4.free(f),这时glibc查看f的chunk头,发现f的上一个chunk是free状态,就把上一个chunk(p)拿来合并


此时正好满足glibc检测条件,unlink后,先执行p=&b;再执行p=&a; 最后结果就是p指向a的首地址,从而控制了从a到p的地址(假如a可写)


直接上代码:

/*多申请一块chunk,防止合并到top chunk里面*/

假设我们只可以控制p、f的申请,释放,写入,unlink后p的地址可控,即可任意地址写


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 8
支持
分享
打赏 + 100.00雪花
打赏次数 1 雪花 + 100.00
 
赞赏  Editor   +100.00 2022/07/13 恭喜您获得“雪花”奖励,安全圈有你而精彩!
最新回复 (2)
雪    币: 4002
活跃值: (163390)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
感谢分享
2022-7-7 11:14
0
雪    币: 220
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
3
师傅想问一下,为什么要-3*sizeof(size_t) 和 -2*sizeof(size_t)啊,有点不大理解取FD和BK是,取fd不应该是+2*sizeof(size_t)吗 这样才可以获取到p->fd,难道p指向的是底部吗 
2022-10-14 18:09
0
游客
登录 | 注册 方可回帖
返回
//