学习ing。
UNCTF 2019 pwn orwHeap
程序分析
程序漏洞很明显,堆溢出能溢出一个字节和末尾的 ‘\x00’。
利用分析
- 首先构造
chunk_overlap
能溢出一个字节和在末尾一个 x00
,可以很常规的构造 chunk overlap
。申请 chunk1 size1
为0x98,chunk2 size2
为 0x68,chunk3 size3为 0xf8,释放 chunk0,利用 chunk2 的 off-by-null
修改 chunk3 的 prev_inuse 位并伪造 prev_size 为 szie1+size2,随后先释放 chunk2 到 fastbin中,再释放 chunk3 合并。
随后再申请一个 size1 的大小,并修改 fake_chunk2 的 size 大于 size2,避免直接申请 size2 会从fastbin 中将原 chunk2取出,改大了 size,需要在 前面申请 chunk3 时 伪造一个 堆头 size。此时 fake_chunk2 的 fd 位残留了 main_arena+88 地址,修改其后两位为 _IO_stdout 结构的地址。最后连续申请两块 size2 的chunk,即可把 _IO_stdout 申请出来。然后修改 _IO_stdout 结构体,泄露地址。
unsortedbin
往free_hook-0x20
处写libc 地址
这道题开启了 沙箱,不能向以往直接 malloc_hook
或 free_hook
改为 gadget
来 getshell
。我们需要利用 stecontext
函数来迁移栈,为了修改 free_hook
的值,我们记得使用 fastbin
attack
在 free_hooK
前面伪造堆块头,但是可以发现正常流程中 free_hook
前面没有常见的 x7f
,所以我们得自己先往 fre_hook-0x10
处 使用 unsortedbin
attack
来写入一个 libc
地址。
由于只能同时申请 5 个 chunk,所以我们先得把之前不用得 chunk 清空,然后利用上一步类似的 chunk_overlap
来构造 unsortedbin attack
。
fastbin attack
修改free_hook
为setcontext
来getshell
经过 unsortedbin attack
往 free_hook
写了 libc
地址后,即可使用 fastbin attack 申请free_hooK
处 的伪造堆块,随后修改 free_hook
的值为 setcontext+53
的地址,并在之前的 堆块处部署 ROP
链。随后 free
该块 即可 getshell
。
EXP
1 | from pwn import * |
- 本文作者: A1ex
- 本文链接: http://yoursite.com/2020/10/06/setcontext利用/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!