个人刚入门pwn,一直觉得300分的题目是道坎,所以cuit的这次比赛pwn300以后的压根就没动,只是默默地将题目下载下来保存,然后线下慢慢啃了。做完这题才发现,原来这题根本没想象中的那么难。。。
题目实现了一个小型记事本程序,有如下命令列表可以进行增删改查(“add”命令其实是程序写错了,应该用“new”命令才对):
个人刚入门pwn,一直觉得300分的题目是道坎,所以cuit的这次比赛pwn300以后的压根就没动,只是默默地将题目下载下来保存,然后线下慢慢啃了。做完这题才发现,原来这题根本没想象中的那么难。。。
题目实现了一个小型记事本程序,有如下命令列表可以进行增删改查(“add”命令其实是程序写错了,应该用“new”命令才对):
好久没玩cuit,今年重拾ctf,入坑pwn,据说cuit题目出的不错,我不管,对本人来讲,能学到东西的题目就是好师傅,下面看题:
题目就给了一个地址,没有任何附件,于是用nc连上去看看:
对于这一题(出自iscc2017)我是又爱又恨,爱是因为它帮助我去学习了一直以来没去实践过的堆分配策略、double free漏洞等相关的经典知识,恨是因为个人水平有限被这道题整整虐了五天,每次觉得突破了一个关卡后面又等着一个坑,让人欲罢不能,最终也实在无奈又好奇地去求教一些大佬才得以解惑,也着实受益匪浅。下面分享一下这题的心路历程吧~
先看一下程序的功能,每次会输出包含4个选项的菜单,分别是1、create(创建内存堆块并保存输入数据)2、read(读取某堆块内存的数据)3、free(释放某堆块的内存数据)4、bye(退出):
有了第一次做题经验后,便对pwn变得异常的喜欢。ssctf2017的这题pwn虽然说很简单,但对于本人这种新手来说绝对爱不释手。程序漏洞逻辑很简单,先输入要输出字符串的大小,分配对应的内存后存储输入字符串,然后再进行输出:
代码如下,这里本身没有漏洞,但是在输出的时候故意使用了个自定义的漏洞函数: