首页
社区
课程
招聘
[原创]第十三题 NeuralCrackme,wp
发表于: 2018-7-12 11:13 3169

[原创]第十三题 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):


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 1
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//