-
-
[原创]第十三题 NeuralCrackme,wp
-
发表于: 2018-7-12 11:13 3169
-
逆向其中的逻辑,发现需要输入10字符,且首先进行了unhex运算,如下:
然后将unhex的五个byte分成两组,放入两double类型的数据中,调用一个函数进行了大数运算,从运算结果来看类似于加法(通过x64dbg获取计算的结果,多次猜测,应该是double的加法,与编程获取的double加法结果基本一致),如下:
而且,在加法运算种,有条件限制,两个double值都在1.0到10.0之间,否则返回值不变,如下:
从结果可以看到,限制条件是整数部分只有一位(即只有个位数,没有前面的位数),后面还有限制,即结果的前三位平方和开根号要小于15.5,且最初unhex结果的byte[2]&0xf必须为0,如下:
虽然限制条件这么多,但是懒得去写那么详细的限制了,通过编程发现,1到10的double类型的值如下:
1 : 00 00 00 00 00 00 f0 3f
2 : 00 00 00 00 00 00 00 40
3 : 00 00 00 00 00 00 08 40
4 : 00 00 00 00 00 00 10 40
5 : 00 00 00 00 00 00 14 40
6 : 00 00 00 00 00 00 18 40
7 : 00 00 00 00 00 00 1c 40
8 : 00 00 00 00 00 00 20 40
9 : 00 00 00 00 00 00 22 40
10 : 00 00 00 00 00 00 24 40
到此可以暴力破解了,从前面的分析来看,输入的格式为: **xx$0**xx
其中:
xx为3F或者40,
$为0~F
**的值根据xx来定,当后面的xx为3F时,其前面的**为F0~FF,当后面的xx为40时,其前面的**为00~23,
由于相互之间不影响,因此可以划分多个部分去遍历,速度会快很多。
带限制条件的暴力脚本如下:
from gio import *
binary_path = "NNCrackme.exe"
is_local = False
is_local = True
ip = "127.0.0.1"
port = 12345
if is_local == True:
target = binary_path
else:
target = (ip, port)
def get_io(target, is_show = True):
io = gio(target, is_show)
return io
def pwn(io, key):
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!