做题笔记。
下载 查壳。
64ida打开。
先运行一下:
? 不是说4位数值么。。。
得,看ida。
__isoc99_sscanf(dest, "%x", &v5);
懂了 dest指向的是v5 ,那么dest怎么来的:
往上走:
通过strncpy得到
但是问题是v19怎么来的,代码中,没有涉及到v19如何而来?
伪代码满足不了,查看汇编呗:
所以实际,v19就是input的值。这里也说明了,为什么我们输入<6的数值会出现:
分析完成,那么,我们if判断下断点看看:
注:(别忘了。。。 - -)
当输入123456时。
如下:
继续测试:
当输入123456667时。
在v19的接收中,【只会接收第六位的数】且【去除最后一位】----为了演示原理。
而在关键算法中,v17【1~5】都是定值(已写在内存,仅只有v5更变,而v5输入也没有做任何变形。)
思考:
那么,是不是仅需要当 v5等于0时 就能求解出 算法中v17【1~5】的值
进而通过 最终结果0xFFFF 减去 v17【1~5】 = v5?(上面其实已经写过v5=0时。。)
计算: 0xFFFF - v17【1~5】的值>>> v5
测验:
咳,这里 其实更建议用flag{1a9f},因为你要提交。
我这么写,只是证明传入原理。。。
flag{1a9f}