0x00 前言
又是一周,学了一周的汇编,到今天真的是一点儿都看不进去了,于是又做做题,找找自信。
0x01 正题
题目中说这是一道内涵的题,所以就先运行一下看一眼思路。
值得一提的是不管回答Y还是N,程序都最终会一闪而过,所以截图这个事情还是挺考验手速的。既然正常运行看不出来,那就只好用PE看一下有没有壳和软件的基础信息了。
从PE中看到,32位软件,用C++编写的。那么自然要用IDA32打开啦。
在流程中可以看到jmp _main_0,程序跳转到main_0中,双击点进去看一下。
结合前面程序运行的流程可以推测,该软件中存在输入(scanf)和输出(printf),所以F5反一下汇编。
在伪代码中可以看到有if判断语句,先分析一下,v4 == 89,输出a0d;在下面的if判断中,v4==78时,输出&byte_425034,否则输出&byte_42501C。通过强大的'R'对89和78进行翻译,89为‘Y’,78为‘N’ 。然后往前看,v5长的很像flag,因此就提交一下试试,果然v5是答案。DBAPP{49d3c93df25caad81232130f3d2ebfad}
0x03 总结
但是,本着学习的态度,打破砂锅问到底,还是要继续分析的。
在while循环中,v6 >= 0且v6等于5,联想前面的软件“距答案出现还有x秒,请耐心等待!”,后面本该出现的“这里应该有答案的balabala的那一串,应该是有一个变量,然后和v5的值进行比较,这个变量就是软件前面提示的程序员没有填写的变量了。由此可以确定,v5的值就是flag。