bof
一道64位的简单栈溢出,system()和bin/sh都有
exp
old school
漏洞点在下图,off-by-null
因为add函数中最多申请8个堆块,所以不能采取传统的填充tcache的方式。
总结一下程序功能,最多分配9个chunk,chunk大小不能超过0x500,申请大小小于等于0x410的时候,统一分配0x108大小的堆
漏洞利用
先利用off-by-null修改C堆块的Prev_size
以及Prev_inuse
free A和C堆块,会触发堆合并机制,合并后放入unsorted bin中
此时可以通过分割unsorted bin来泄露libc(通过前面的步骤我们可以控制还在unsorted中的堆块B)
用IDA分析libc-2.27.so文件获得main_arena与libc偏移,在malloc_trim中即可获得
再通过tcache的fd指针引入__free_hook
。最后写system到__free_hook
。释放有/bin/sh字符串的chunk
free后tcache:2->4,申请后tacahe:free_hook -> 4,然后申请2次,就可以申请到指向free hook的内存