Tokyo Western CTF 2017 - Parrot
Tokyo Western,因为他们参加了WCTF,于是就有了这个题……
程序分析
程序非常简单,每次输入一个size之后malloc一个buffer,然后read数据进来,往buffer尾部写一个0,之后再write出来,像鹦鹉一样,所以叫做parrot
。总的来说,就是下面一个循环
1 | while(1) { |
要说漏洞,就是这个size
可以被完全控制,当size
过大时buf会返回NULL
,这样在下面其实就是向size-1
的位置写了个0,相当于一个任意地址写0.
利用思路
首先做一个libc的leak,先malloc出2个不同大小的fastbin chunk,之后触发一个malloc_consolidate
,这样上面一个fastbin chunk在被投入unsorted bin时就会留下其指针。在之后利用write读出来就可以leak libc了。
之后就是通过这个任意地址写0进行破坏了,在想了好几个目标之后,我想到了@angelboy在WCTF上教的位置……
1 | _IO_FILE_plus |
在stdin的_IO_FILE
结构中,_IO_buf_base
和_IO_buf_end
指示了这个FILE使用buffer的位置,由于程序做了setbuf
的操作,这个buffer就位于结构体内部_shortbuf
的位置。如果将一个0写到_IO_buf_base
的最低位,就可以将buffer往前扩展。在scanf
输入时,输入的数据会覆盖掉_IO_buf_base
指针自身,我们可以把它修改成__free_hook
的地址。这样在本身buffer里面的字符消耗完之后,就可以进一步去修改__free_hook
了。
之后通过输入一些字符来让buffer全都消耗掉,再写入system
的地址就可以了。
利用本身写的不是很稳定,可能是在输入的处理上有些问题。
参考脚本
1 |
|