昨天说到处理完输入了,今天把这道题干掉了,一定要有耐心,慢慢调试。
把输入的三个数设为x,y,z。
断到这里,
注释都标注了,自己分析一下。
在这里,发现goto到label_47就直接到运行结束了,没有flag,所以就不让他跳转,就要满足x<z
类似的,也要满足y<x。继续单步,来到一堆计算的地方。
这里是计算位数的。
这都是一步一步分析的,没什么说的。
有很多类似下边这种的判断,刚开始分析了一下,后来发现不影响值的变化,可以忽略。
继续调试,看到了flag字样:
这里只有v88小于等于0时才能执行到You win,然后v88又是某个数的位数,所以只能等于0,然后就需要往上翻找到刚才的一堆计算,最后可以得出如下:
(x+y)**3-(x*3*y**2)-(x**2*3*y)=0
((z+4)**3-z*z*12)-z*48-22=0
可以得出,x**3+y**3-z**3=42
我也算不出来,但是有答案啊,说实话就算我比赛的时候做到这儿,我也不知道有这么三个数。。。。
一定要记住,分析程序的时候,不要太依赖IDA的伪代码,很多代码我都是配合汇编才看懂,这道题需要慢慢分析各个函数的作用,要有耐心。