在那个只有零和一的世界里,对零的向往,终究是一的执着。

正在下载:1.zip 看雪CTF2017学习记录整理系列1

导入表定位输入获取API

或者字符串定位输出:

字符串定位输出

然后直接到达验证代码:

找到验证代码位置

可以看到有花指令,会干扰IDA创建该验证函数,导致不能F5看伪代码,可以将其patch掉:

patch花指令

然后在该验证代码开头位置(函数特征识别)右键,点击创建函数:

创建IDA函数

成功创建了一个验证子函数:

验证子函数创建成功

此时可以成功F5反编译伪代码:

正常反编译

分析出以上验证流程就很清晰了,可以确定输入key是4位数字,满足计算结果为一个浮点数384.0即可。这题原本是有多解,后来又加上了如上的排除条件。最后根据计算过程,实际上等价于(v0-v1) * buf == 24,其中buf为第4位数字,v0为第3位数字,v1为第1位数字除以5,注意这里5为IDA自动识别了第2位数字,实际上第1位数字前面验证条件也固定为了1,所以v1实际上等于0.2。因此得到一个二元方程:(i2-0.2) * i3 = 24,唯一整数解为:i2=i3=5,即key为1555。而其实如果将输入字符集包括大小写字母,穷举还能得到另一组key:151N。穷举脚本这里就不写了,比较简单,可以根据算法用python跑,也可以写调试器脚本自动穷举。

验证成功