only_add
思路
realloc的利用
realloc申请的堆块比当前堆块小时,如果差值足够一个chunk就切割当前chunk
realloc大小为0的堆块时就会释放当前的chunk
然后程序当申请堆块往堆块里面写入数据时可以额外写一个字节offset-by-one
通过realloc和offset-by-one漏洞,将申请的0x40大小的chunk改成0xe0。申请再释放后他们都进入了0xe0的tcache。由于申请的3个0x40的块都间隔0x20,每个堆块都被前面的堆块重叠。
在申请0x500的空间切割后释放,进入unsortbin,此时就又了libc地址
由于和之前改过大小的堆块相邻,通过构造tcache链可以将unsortbin中的堆块链入tcache并改写fd的低字节使其指向stdout
不断申请堆块控制stdout,将IO_write_base的低字节设置为0,泄漏出libc地址
此时利用程序的del函数清空buf
仍然利用之前的重叠的堆块,控制__free_hook为system的地址(控制的地址往前挪8个字节,用来放/bin/sh\0)
申请一个0的空间就会调用free出发__free_hook获得shell
注意由于输出流被关掉,输出时要将输出重定向到错误流(也就是屏幕上)输出,cat flag >&2
EXP
1 | from pwn import * |