ciscn2021初赛
感谢wepn的队友
Column: May 17, 2021
pwny:
首先ida看一眼发现read文件描述符全是3, 好像是读个随机数, 然后我们在3的地址上连着用Write读两次就可以把他变成0, 就可以写入内存了, 后面就是数组越界写, 负数可以往前面读读出libc偏移和pie偏移, 在得到libc之后可以获得环境变量environ的地址, 之后通过(libc_base+libc.sym[‘environ’]-pie_base-0x202060)/8, 就可以得到其位置是数组的第几号元素, 然后调用Read()读取栈地址, 之后由于main函数不存在返回函数, 我们需要使用其它函数这里我用的Read(),
这俩一减, 然后再和上面类似就可以算出Read()的ret在数组上为第几号元素, 这样在下次的Write()中可以直接写入ret的地址了(ps. 这里的偏移也要动态调试, 反正到最后也是固定的), 之后在ret上嗯写onegadget就行了
exp:
lonelywolf:
和下面的silverwolf差不多吧, 能做出下面的肯定能做出上面的, 这题我用的方法是通过scanf将fastbin写入unsortedbin中然后泄露libc, 之后改改tc结构和chunk的tc就结束了,简单题嘞~
exp: