-
-
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直播授课
赞赏
他的文章
谁下载
无
看原图