0%

SCUxOPPO-CTF

bof

一道64位的简单栈溢出,system()和bin/sh都有

image-20220521123054003

exp

image-20220521123139709

image-20220521123229884

old school

漏洞点在下图,off-by-null

image-20220521133005119

因为add函数中最多申请8个堆块,所以不能采取传统的填充tcache的方式。

总结一下程序功能,最多分配9个chunk,chunk大小不能超过0x500,申请大小小于等于0x410的时候,统一分配0x108大小的堆

漏洞利用

先利用off-by-null修改C堆块的Prev_size以及Prev_inuse

image-20220606143854660

image-20220606143839980

free A和C堆块,会触发堆合并机制,合并后放入unsorted bin中

image-20220606144229563

此时可以通过分割unsorted bin来泄露libc(通过前面的步骤我们可以控制还在unsorted中的堆块B)

用IDA分析libc-2.27.so文件获得main_arena与libc偏移,在malloc_trim中即可获得

image-20220606155503187

image-20220606155615765

再通过tcache的fd指针引入__free_hook。最后写system到__free_hook。释放有/bin/sh字符串的chunk

free后tcache:2->4,申请后tacahe:free_hook -> 4,然后申请2次,就可以申请到指向free hook的内存

image-20220606170138492