SCTF2019 two_heap
前言
一个冷知识=半小时内解决一道题
程序逻辑
程序还是只有Malloc和Free。
main函数里有个printf的格式化字符串漏洞但是printf_chk似乎不能非连续地输入%x%nx这样。
malloc的size被8对齐处理,之后放入node[0],chunk_addr放入node[1]。size开始都被初始化为0x80,且每次malloc的size不能与已经malloc的相同(指8对齐后的size)。且这里检查了bss里有无stdout地址。malloc的数量最多为8个。
free这里存在double free。
漏洞利用
__printf_chk可以用”%a%2$a%3$a”泄露出栈地址,根据固定偏移算出libc地址。
分配一个size=0的chunk,double free再malloc一个size=0x10的chunk修改fd,malloc一个size=0x8的chunk,再malloc一个size=0x18的即可分配到free_hook,改成system,最后free一个”/bin/sh\x00”的块拿shell
exp.py
1 | #coding=utf-8 |