网鼎杯 第二场 fmt
学弟扔了网鼎杯的一道pwn给我,看了下发现是格式化字符串,恰巧昨天刚刚做了一道stack_check_fail劫持的格式化字符串题,今天又做格式化可以说还是比较轻松的。
小伙伴扔给我这道题,看了下发现是个堆题。ida看了一下发现在edit函数中存在一个栈溢出,strcat的时候可以接0x90个字节,而dest空间只有0x80个字节,这里存在一个栈溢出,可以覆盖v7为任意值,但是其实很坑,程序内部有一个非常无耻的在字符串最后一个位置+’\x00’的操作,导致这里一直不能成功覆盖。后来看wp才知道strncat对不同偏移处碰到的0有多往后输入几个字字节的情况,但是我在本地18.04的环境下测试并没有成功,可能是libc的原因(待会换回16.04 //捂脸捂脸)。
之后的利用思路就简单了,edit函数最后有一个free(v7)的操作,由于我们可以覆盖v7为任意值,这里我们将v7覆写为bss段存储堆指针所在的地址头,这样我们可以通过再次malloc进行一个arbitray malloc,达到任意地址malloc的结果。