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

[原创]第十三题 NeuralCrackme,wp

2018-7-12 11:13
2511

NNCrackme.exe

逆向其中的逻辑,发现需要输入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):

        #io.read_until("Input your KEY:")

        io.writeline(key)

        #io.writeline("test")

        io.read_until(":")

        data = io.read(10)

        if "Ohhh" in data:

                 return

        if "Come on" in data:

                 return

        raw_input(":")

        #io.wait_for_debug()

        io.interact()

        exit(0)

        pass

if True:

        for i in range(0x0, 0x24):

                 for j in range(0, 0x24):

                         for l in range(0, 0x10):

                                  key = ("%02x40%02x%02x40"%(i, l<<4, j)).upper()

                                  io = get_io(target)

                                  pwn(io, key)

if False:

        for i in range(0, 0x24):

                 for j in range(0xf0, 0x100):

                         for l in range(0, 0x10):

                                  key = ("%02x40%02x%02x3f"%(i, l<<4, j)).upper()

                                  io = get_io(target)

                                  pwn(io, key)

if False:

        for i in range(0xf0, 0x100):

                 for j in range(24, 0x24):

                         for l in range(0, 0x10):

                                  key = ("%02x3f%02x%02x40"%(i, l<<4, j)).upper()

                                  io = get_io(target)

                                  pwn(io, key)

结果如下:


最终key为:F13FE02140



[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
点赞1
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回