思路
这题有意思,记录一下思路,具体分析可以参考de1ctf_2019_weapon (IO_FILE)
这题保护全开,又没有 show 函数,想了半天,看 wp 才想起还能爆破 IO_FILE 来泄露 libc 地址,之后便是常规 fastbin attack 拿 shell 了。
具体步骤:
- 通过 fastbin attack 造成堆块重叠。
- edit 修改重叠堆块的 size ,再做 free 操作获得 fastbin 跟 unsorted bin 。
- 通过覆盖 unsorted bin 在堆上踩出的 main_arena 地址的低位来爆破 IO_2_1_stdout 地址。
- 通过 fastbin attack ,分配到 IO_2_1_stdout 处,修改 _IO_FILE 的内容,程序再次执行 puts 时即可泄露 libc 地址。
- 有了 libc 地址便能计算出 one_gadget 跟 malloc_hook 的地址,然后再来一次 fastbin attack 将 malloc_hook 覆盖为 one_gadget 地址。
- 控制程序再次执行 malloc ,就能执行 one_gadget 拿 shell 了。