Bugku-ez fibon wp题解

1.2.下载附件,用Exeinfo PE软件查壳,发现是加了upx壳

2.对exe文件进行upx脱壳(为了防止出现文件,对文件重命名去除空格)

3.对代码进行分析

4.显然,我们需要获取v5的值和对v5进行解码:

4.1获取v5的值,(懒得手动了删了,直接用re获取)

import re
s='''
    v5[0] = 100;
    v5[1] = 121;
    v5[2] = 110;
    v5[3] = 118;
    v5[4] = 70;
    v5[5] = 85;
    v5[6] = 123;
    v5[7] = 109;
    v5[8] = 64;
    v5[9] = 94;
    v5[10] = 109;
    v5[11] = 99;
    v5[12] = 116;
    v5[13] = 81;
    v5[14] = 109;
    v5[15] = 86;
    v5[16] = 83;
    v5[17] = 126;
    v5[18] = 119;
    v5[19] = 101;
    v5[20] = 110;
    v5[21] = 114;
'''
b=re.findall(r'.*= (.*?);',s)
#b的值就是我们需要的v5的值了,但是这个时候还是字符串,使用的时候要int转换为数字才是v5的值

4.2写解码过程,这个就是解码脚本了,过程分析请看5

b=['100', '121', '110', '118', '70', '85', '123', '109', '64', '94', '109', '99', '116', '81', '109', '86', '83', '126', '119', '101', '110', '114']
#用上面那段代码获取,打印一下就是b了
l=len(b)
c=''

v8,v9=1,1 #对应反编译代码里面的v8v9对代码进行一个逆向的计算
for i in range(l):
    if i&1==0:
        v8+=v9
        for j in range(64,127):
            v4 = (v8 + j + i) & 0x3F
            if int(b[i])==(v4+64) :c+=chr(j)
    else:
        v9+=v8
        for j in range(64,127):
            v4 = (v9 + j + i) & 0x3F
            if int(b[i])==(v4+64) :c+=chr(j)
print(c)

5.解码过程分析

5.1编码分析

观察得知,索引奇数和偶数进行了不同的操作,但下标为奇数和偶数操作相似,只是对v8和v9进行了个交换而已,所以,我们只要得到奇数的解码,然后把v8和v9互换,就得到了偶数的解码

5.2

j和v8是已知的,需要求的是原来的字符,v3%64+64以后,v3的值介于64-127,所以而ASCII码的范围是0-127,所以,我们可以从64-127爆破得到字符的值,爆破得到的值是脚本中的j,脚本中的j的值与输入的值相同的时候,得到我们的爆破值

v8,v9=1,1 #对应反编译代码里面的v8v9对代码进行一个逆向的计算
for i in range(l):
    if i&1==0:
        v8+=v9
        for j in range(64,127):#从64-127爆破
            v4 = (v8 + j + i) & 0x3F #等效于(v8 + j + i)%64
            if int(b[i])==(v4+64) :c+=chr(j)#可以直接加个break加快运行速度,但是没必要

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值