首页
社区
课程
招聘
CTF第二题
2017-10-28 02:24 2412

CTF第二题

2017-10-28 02:24
2412
      这个题出的很有意思,也挖了个大坑。涉及到栈溢出和代码混淆。

     首先找到_main,初看发现结构很简单。输入字符串,进行两个函数判断,同时判对如果符合即输出“You get it!”。

      但是仔细思考后发现想解出符合一个函数的两个Dword都很难,别说两个判断函数sub_401090和sub_4010E0同时都判对,开始考虑到可能产生进位溢出,无法用二元一次方程原理思考,所以写函数进行爆破,尽管将输入字符取值范围限制在“0-9a-zA-Z”,仍然无法爆破,一方面轮训完时间太久,二是可能不存在符合这两个函数的数值。

       1、尝试发现,当输入字符个数过多时,程序会崩溃,猜测其对输入字符个数未进行限制,导致产生堆栈溢出,仔细观察scanf函数和sub_401050,输入的第13、14、15个字符串会溢出修改函数返回地址。
      2、想让程序进入正确流程,一种方法是如果可以修改初值为2的dword_41B034为0即可;
      3、IDA搜索未发现明显其他调用地方。猜测其在一堆花指令里。
      4、因此填入字符串aaaabbbbcccc11A,将函数返回花指令区域首地址改为:0x413131
      5、进入之后使用OD动调,绕过层层跳转,发现其中有对 dword_41B034置0,以及输入字节判定的三元一次方程时,程序正常返回_main。
             (x-y)<<2+a+c = 0xeaf917e2;
             (x-y)<<1 + (x-y) + c = 0xe8f508c8;
             (x-y)<<1 + (x-y) - c = 0xc0a3c68;
最终可将x\y\z解出。验证码为:Just0for0fun11A

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
点赞1
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回