题目
https://gitee.com/csomebro/ctftask/blob/master/2022-02_TQLCTF/unbelievable_write.zip
解题
Checksec发现没开PIE

IDA检查,主要逻辑就是三个函数c1 c2 c3



发现只要修改target的值就可以得到flag

在c2中可以伪造一个堆的chunk到tcache bin中,实现堆块堆叠,之后可以修改物理地址相邻的下一个堆块的fd指针,实现任意位置写(题目附件给了Dockerflie,使用Ubuntu20.04起的docker)
在gdb调试中会发现target上方就是got表,直接伪造在target上伪造chunk在从c1中能够申请但free时会报错,过不了_int_free中的检验,解决方法就是修改free的got表,让他不要free不就行了hhhh,即在tcache中布置好两个伪造的堆块,一个用于修改free_got,一个用于修改target,由于不需要free了,堆块的地址也不需要16位对齐了。
Exp
1 | from pwn import * |
本文采用CC-BY-SA-4.0协议,转载请注明出处
作者: Csome
作者: Csome