文件下载地址:https://static2.ichunqiu.com/icq/resources/fileupload//CTF/JCTF2014/re200
下载的文件,首先还是判断是什么格式的,丢进die,有dos头,但识别不出来NT头等其他部分。
所以我们可以看下PE头签名是否有问题,这里我们用010 editor里的exe.bt来解析文件。
解析可以发现NT头签名有问题,和默认的0x00004550不一致。
可能因此导致NT头解析有问题。我们仔细观察可以发现二进制文件里,NT头位置从E9开始,正确应该是从E8开始。
所以修改这两处,我们保存在用die看看
发现可以正常解析了。
先运行程序看有没什么提示,发现让输入9个数字,然后最后打印结果。
用IDA来分析,可以看到success字符串,然后打印flag字符串。但上面有一系列判断语句。并且发现flag和输入的数字有关,无法通过跳转修改获取flag。
接收输入字符串,使用for循环,从v20开始接收,每一个数字用dword来存储。
首先是三个if语句判断v20,v21,v22的值。
可以得到计算公式,需要满足以下公式
v20 * v21 * v22 == 1166
(v21^v20) == v22 -4
(v22 + v21 + v20) % 100 == 34
根据下来逻辑,可以得知v23=80,v24=94,v25=98,但剩下三个数字,没有进行计算,猜测可以为任意数。
v20 * v21 * v22 == 1166 ,根据这个公式,我假设这三个值都不大于100,然后写了个脚本遍历所有1-100的数字,获取满足条件的值。
最终脚本如下,因为符合条件的值有多个,所以每次获得的值就调用程序输入,看结果是否符合要求,脚本重定向标准输入输出到PIPE方便操作。获得success结果就终止。
最后运行脚本结果如下