花了半天的时间去理解吃透这道题目,也参考了大佬的wp
(1条消息) 【pwn】SWPUCTF_2019_p1KkHeap_Nothing-CSDN博客、
(1条消息) swpuctf2019 p1KkHeap 详细题解_seaaseesa的博客-CSDN博客
有关程序的分析我就不说了,只讲述做题目的思路
因为这道题目的限定,常规的tcachebin攻击肯定不行了所以我们需要新的思路
因为在c语言中,无符号的数和有符号的数比较,会将有符号的数字转换为无符号的
所以当我们在tcache申请一个chunk的时候,通过double free释放同一个chunk的时候count=2
而我们继续申请三个同样大小的chunk的时候count=-1,tcache会判断大于7下一个free的chun会放入unsorted bin里面从而获取到libc版本
关于tcache_entry
因为我们需要攻击malloc_hook和0x66660000这俩个地方,常规的办法不足以支撑我们同时攻击,所以需要我们攻击tcache_entry这个地方
tcache_entry就是tcache bin的表头,当我们修改了这个地方的值,申请的下一个chunk就是我们修改的这个地方从而实现了攻击
而tcache_entry一般在tcache bin头部的中间某个地方,所以我们可以通过偏移来修改这个地方
这道题目的思路到现在就梳理完毕了:
申请俩个chunk,double free 再申请3个chunk获得libc的基值修改malloc_hook为0x66660000的值,在此期间,向0x66660000的地方写入shellcode 在申请一个chunk触发hook拿到flag
完整exp如下
tcache_entry的偏移如下
可以看到我们free的chunk的fd在这个地方,所以这里就是 tcache_entry的地址
别忘了地址多加一个0x8的偏移
成功获得flag
结束!!!!
(这个flag是我后来本地调试自己加的flag)