SWPUCTF_2019_p1KkHeap(tcache_entry)

花了半天的时间去理解吃透这道题目,也参考了大佬的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如下

SWPUCTF_2019_p1KkHeap(tcache_entry)

 

 

 

 tcache_entry的偏移如下

 SWPUCTF_2019_p1KkHeap(tcache_entry)

 

 SWPUCTF_2019_p1KkHeap(tcache_entry)

 

 可以看到我们free的chunk的fd在这个地方,所以这里就是 tcache_entry的地址

SWPUCTF_2019_p1KkHeap(tcache_entry)

 

 别忘了地址多加一个0x8的偏移

成功获得flag

SWPUCTF_2019_p1KkHeap(tcache_entry)

 

 

 

 结束!!!!

(这个flag是我后来本地调试自己加的flag)

上一篇:Redis学习--渐进式rehash实现原理


下一篇:c#事务用法