攻防世界中这道题是pwnable.tw上面的原题,虽然在攻防世界上难度为7星,不过实际上这题不算难,只需要利用UAF就可以完成。
题目分析
题目链接:https://pan.baidu.com/s/1T-mIVLkxvyZ_7VvlBuInZQ
提取码:azyd
checksec:
保护机制比前几题弱了很多
main:
hacknote实现了三个功能:
1.添加(上限为5)
在新建note时,程序会先申请一个8bytes大小的空间,然后把打印的函数指针放入前4个bytes,后四个bytes放note的内容的指针。
2.删除(删除之后没有将指针置空,明显的UAF漏洞)
3.显示
打印内容的函数:
因为本题使用了函数指针,这使得题目难度降低许多。我们只需要控制函数指针,就能得到shell
漏洞利用
- 创建两个大小为0x80的note,此时堆结构如下:
然后将它们delete,这样两个note的块就进入了fastbin
此时fastbin为note[0]<-note[1]
- 创建一个大小为0x8的note,为note[2], note[2]与note[1]指向相同的位置,并且note[2]的内容指向note[0]相同的位置,构造payload=p32(my_puts) + p32(read_got),就能获得read的地址从而计算system的地址
- 把note[2]删除,创建note[3],note[3]也与note[1]指向相同的位置,并且note[3]的内容也指向note[0]相同的位置,构造payload = p32(system) + ‘||sh’
这里说一下为什么用 “||sh”:
在show函数中