吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2546|回复: 8
收起左侧

[CTF] 【hxpCTF 2022】required - WP

  [复制链接]
sixxx1 发表于 2023-3-15 16:42
本帖最后由 sixxx1 于 2023-3-15 16:55 编辑

比赛时间是2023年3月11-13日,不过这次hxpCTF写的是2022。

0x01 题目说明

Description:

I have written a super safe flag encryptor. I’m sure nobody can figure out what my original flag was:

0xd19ee193b461fd8d1452e7659acb1f47dc3ed445c8eb4ff191b1abfa7969

Dockerfile for your convenience / to ensure correct environment.

题目附件

Download:

[required-27edfc0c02c5f748.tar.xz (11.4 KiB)](https://2022.ctf.link/assets/files/required-27edfc0c02c5f748.tar.xz)

0x02 解题思路

题目是利用大量的 require 函数对大量 js 文件进行包含引入模块,从而将 flag 数组做加密,类似于一种代码混淆。

1678637288405-c6bb15c4-c2c9-41b7-b2fc-2e29e9fdfcc3.png

每一个js文件最终生效的是后面对 f 数组的操作,前面只是一些模块导出语法。

image-20230315141400339.png

(PS:nodejs可以用chrome调试,在命令行中用 node inspect app.js,在chrome中访问 chrome://inspect,然后打开DevTools就可以调试了。)

flag长度有30位,所以i、j、t一直在做取余30的计算。

1678637353352-a985d92d-1650-451c-84d5-790f938cfc68.png
因为是动态解析js文件再做包含,其中还包括了一些复杂的模块导出和引入、清除 require 缓存的操作,如果直接解析 js 语法提取所有对 flag 数组的操作,有点绕了弯路。。一开始在这里卡了很久。
后来想到,何不直接改了所有js文件,再其中插入console.log,让模块被加载的同时也把操作语句给输出。
[Python] 纯文本查看 复制代码
import os

path = './files'
outpath = './out'
files = os.listdir(path)
s = []

for file in files:
    str = ""
    if not os.path.isdir(file) and file.endswith(".js") and file != "required.js":
        f = open(path + "/" + file, "r")
        str = f.read()
        f.close()

        # 原文件内容:
        #   module.exports=(i,j,t)=>(i%=30,j%=30,t%=30,i+=[],j+"",t=(t+{}).split("[")[0],f[j]+=f[i],f[j]&=0xff)
        # 修改成:
        #   module.exports=(i,j,t)=>(i%=30,j%=30,t%=30,i+=[],j+"",t=(t+{}).split("[")[0],console.log("f[" + j + "]+=f[" + i + "],f[" + j + "]&=0xff"),f[j]+=f[i],f[j]&=0xff)
        if 'i%=30' in str:
            oper = re.findall(r'f\[.*?$', str)[0][:-1]
            oper = oper.replace('i', '\" + i + \"').replace('j', '\" + j + \"').replace('t', '\" + t + \"')
            patch = "split(\"[\")[0],console.log(\"" + oper + "\"),"
            str = str.replace("split(\"[\")[0],", patch)
            f = open(path + "/" + file, "w")
            f.write(str)
            f.close()
            print ("[+] Open And Write: " + file)
            print ("[+] " + str)

再次运行 required.js,获得 flag 数组的所有操作
Snipaste_2023-03-15_16-54-40.jpg
全部整理如下(一共300行,这里只放了前面几行):
[JavaScript] 纯文本查看 复制代码
f[17]+=f[5],f[17]&=0xff
f[29]=~f[29]&0xff
f[3]^=f[11]
f[6]=f[6]<<7&0xff|f[6]>>1
f[2]=~f[2]&0xff
f[20]=f[20]<<7&0xff|f[20]>>1
f[23]=f[23]^(f[23]>>1)
f[15]=f[15]^(f[15]>>1)
f[9]^=f[1]
f[9]^=f[4]
f[16]=f[16]^(f[16]>>1)
f[11]=f[11]<<1&0xff|f[11]>>7
f[28]=~f[28]&0xff
f[0]=~f[0]&0xff
f[16]+=f[13],f[16]&=0xff
f[14]+=f[29],f[14]&=0xff
f[13]=~f[13]&0xff
f[26]-=f[7],f[26]&=0xff
f[26]-=f[0],f[26]&=0xff
f[18]-=f[29],f[18]&=0xff
f[8]=f[8]<<1&0xff|f[8]>>7
f[4]=f[4]^(f[4]>>1)
f[5]-=f[7],f[5]&=0xff
f[10]^=f[29]
f[15]^=f[20]
f[22]=f[22]<<7&0xff|f[22]>>1
f[4]^=f[15]
f[13]-=f[3],f[13]&=0xff
f[5]=f[5]<<1&0xff|f[5]>>7
f[26]=f[26]<<7&0xff|f[26]>>1
f[14]^=f[21]
f[29]=f[29]<<7&0xff|f[29]>>1
f[1]-=f[4],f[1]&=0xff
f[4]=~f[4]&0xff
f[13]-=f[18],f[13]&=0xff
f[16]=f[16]<<1&0xff|f[16]>>7
f[11]=f[11]<<7&0xff|f[11]>>1
f[7]-=f[6],f[7]&=0xff
f[11]-=f[20],f[11]&=0xff
f[23]=~f[23]&0xff
// ......

接下来就是所有语句倒序,并做逆运算。
替换+去重,只有以下这些算法,需要获得所有逆运算方式。
[JavaScript] 纯文本查看 复制代码
A=~A&0xff
A-=B,A&=0xff
A+=B,A&=0xff
A=A^(A>>1)
A^=B
A=(((A*0x0802&0x22110)|(A*0x8020&0x88440))*0x10101>>>16)&0xff
A=A<<1&0xff|A>>7
A=A<<7&0xff|A>>1

逆运算整理:
[JavaScript] 纯文本查看 复制代码
// 1、原句不动可逆向
f[24]=~f[24]&0xff
f[24]=~f[24]&0xff

// 2/3、+ 和 - 互换即可
f[1]+=f[24],f[1]&=0xff
f[1]-=f[24],f[1]&=0xff

// 4、不知道怎么逆向ing,卡在这里
f[14]=f[14]^(f[14]>>1)

// 5、直接可逆
f[23]^=f[21]
f[23]^=f[21]

// 6、直接可逆
f[15]=(((f[15]*0x0802&0x22110)|(f[15]*0x8020&0x88440))*0x10101>>>16)&0xff
f[15]=(((f[15]*0x0802&0x22110)|(f[15]*0x8020&0x88440))*0x10101>>>16)&0xff

// 7、按下面改,1和7互换
f[11]=f[11]<<1&0xff|f[11]>>7
f[11]=f[11]<<7&0xff|f[11]>>1

// 8、按下面改,7和1互换
f[20]=f[20]<<7&0xff|f[20]>>1
f[20]=f[20]<<1&0xff|f[20]>>7

后来其实在第4个加密这里卡了很久,查了很多资料没找到逆向方法。既然逆不出来,那就直接爆破大招吧,用for来替换:
[JavaScript] 纯文本查看 复制代码
// f[16]=f[16]^(f[16]>>1)
for (var i = 0; i <= 255; i++) {
    if ((i^(i>>1)) == f[16]) {
        f[16] = i
        break
    }
}


0x03 EXP
getflag.js:
[JavaScript] 纯文本查看 复制代码
f = [209,158,225,147,180,97,253,141,20,82,231,101,154,203,31,71,220,62,212,69,200,235,79,241,145,177,171,250,121,105]

f[0]=~f[0]&0xff
f[15]+=f[17],f[15]&=0xff
f[20]-=f[14],f[20]&=0xff
f[18]+=f[14],f[18]&=0xff
f[10]+=f[1],f[10]&=0xff
// f[28]=f[28]^(f[28]>>1)
for (var i = 0; i <= 255; i++) {
    if ((i^(i>>1)) == f[28]) {
        f[28] = i
        break
    }
}

// f[7]=f[7]^(f[7]>>1)
for (var i = 0; i <= 255; i++) {
    if ((i^(i>>1)) == f[7]) {
        f[7] = i
        break
    }
}

f[6]-=f[26],f[6]&=0xff
f[18]-=f[25],f[18]&=0xff
f[27]+=f[14],f[27]&=0xff
// f[11]=f[11]^(f[11]>>1)
for (var i = 0; i <= 255; i++) {
    if ((i^(i>>1)) == f[11]) {
        f[11] = i
        break
    }
}
f[9]+=f[8],f[9]&=0xff
f[24]^=f[12]
f[5]-=f[20],f[5]&=0xff
f[2]+=f[23],f[2]&=0xff
f[23]^=f[21]
f[13]^=f[24]
f[20]=~f[20]&0xff
// f[5]=f[5]^(f[5]>>1)
for (var i = 0; i <= 255; i++) {
    if ((i^(i>>1)) == f[5]) {
        f[5] = i
        break
    }
}
f[27]=~f[27]&0xff
f[22]+=f[2],f[22]&=0xff
f[17]-=f[15],f[17]&=0xff
// f[10]=f[10]^(f[10]>>1)
for (var i = 0; i <= 255; i++) {
    if ((i^(i>>1)) == f[10]) {
        f[10] = i
        break
    }
}
f[15]+=f[28],f[15]&=0xff
f[15]=(((f[15]*0x0802&0x22110)|(f[15]*0x8020&0x88440))*0x10101>>>16)&0xff
f[3]-=f[24],f[3]&=0xff
f[14]^=f[13]
f[8]=~f[8]&0xff
f[16]+=f[7],f[16]&=0xff
// f[26]=f[26]^(f[26]>>1)
for (var i = 0; i <= 255; i++) {
    if ((i^(i>>1)) == f[26]) {
        f[26] = i
        break
    }
}
// f[10]=f[10]^(f[10]>>1)
for (var i = 0; i <= 255; i++) {
    if ((i^(i>>1)) == f[10]) {
        f[10] = i
        break
    }
}
f[26]=f[26]<<7&0xff|f[26]>>1
f[25]+=f[24],f[25]&=0xff
f[8]=f[8]<<7&0xff|f[8]>>1
f[20]^=f[3]
f[3]=f[3]<<1&0xff|f[3]>>7
// f[29]=f[29]^(f[29]>>1)
for (var i = 0; i <= 255; i++) {
    if ((i^(i>>1)) == f[29]) {
        f[29] = i
        break
    }
}
f[10]+=f[7],f[10]&=0xff
f[23]=~f[23]&0xff
f[12]-=f[13],f[12]&=0xff
f[0]^=f[16]
f[18]=~f[18]&0xff
f[7]+=f[17],f[7]&=0xff
// f[11]=f[11]^(f[11]>>1)
for (var i = 0; i <= 255; i++) {
    if ((i^(i>>1)) == f[11]) {
        f[11] = i
        break
    }
}
f[0]+=f[14],f[0]&=0xff
f[1]+=f[2],f[1]&=0xff
f[4]+=f[8],f[4]&=0xff
// f[10]=f[10]^(f[10]>>1)
for (var i = 0; i <= 255; i++) {
    if ((i^(i>>1)) == f[10]) {
        f[10] = i
        break
    }
}
f[6]=f[6]<<1&0xff|f[6]>>7
f[2]-=f[17],f[2]&=0xff
f[11]=(((f[11]*0x0802&0x22110)|(f[11]*0x8020&0x88440))*0x10101>>>16)&0xff
f[13]=(((f[13]*0x0802&0x22110)|(f[13]*0x8020&0x88440))*0x10101>>>16)&0xff
f[1]+=f[27],f[1]&=0xff
// f[13]=f[13]^(f[13]>>1)
for (var i = 0; i <= 255; i++) {
    if ((i^(i>>1)) == f[13]) {
        f[13] = i
        break
    }
}
f[10]=f[10]<<1&0xff|f[10]>>7
f[25]=f[25]<<7&0xff|f[25]>>1
f[4]=f[4]<<1&0xff|f[4]>>7
f[0]-=f[22],f[0]&=0xff
f[21]-=f[18],f[21]&=0xff
f[8]-=f[1],f[8]&=0xff
f[3]=f[3]<<7&0xff|f[3]>>1
// f[12]=f[12]^(f[12]>>1)
for (var i = 0; i <= 255; i++) {
    if ((i^(i>>1)) == f[12]) {
        f[12] = i
        break
    }
}
f[24]=(((f[24]*0x0802&0x22110)|(f[24]*0x8020&0x88440))*0x10101>>>16)&0xff
// f[21]=f[21]^(f[21]>>1)
for (var i = 0; i <= 255; i++) {
    if ((i^(i>>1)) == f[21]) {
        f[21] = i
        break
    }
}
// f[17]=f[17]^(f[17]>>1)
for (var i = 0; i <= 255; i++) {
    if ((i^(i>>1)) == f[17]) {
        f[17] = i
        break
    }
}
// f[14]=f[14]^(f[14]>>1)
for (var i = 0; i <= 255; i++) {
    if ((i^(i>>1)) == f[14]) {
        f[14] = i
        break
    }
}
f[11]^=f[27]
f[1]+=f[24],f[1]&=0xff
f[2]=f[2]<<1&0xff|f[2]>>7
f[13]=f[13]<<7&0xff|f[13]>>1
f[24]-=f[12],f[24]&=0xff
f[4]+=f[20],f[4]&=0xff
f[4]+=f[22],f[4]&=0xff
f[24]=~f[24]&0xff
f[10]=f[10]<<7&0xff|f[10]>>1
f[26]^=f[17]
f[22]=~f[22]&0xff
f[28]+=f[13],f[28]&=0xff
f[20]=f[20]<<1&0xff|f[20]>>7
f[17]-=f[27],f[17]&=0xff
// f[0]=f[0]^(f[0]>>1)
for (var i = 0; i <= 255; i++) {
    if ((i^(i>>1)) == f[0]) {
        f[0] = i
        break
    }
}
// f[19]=f[19]^(f[19]>>1)
for (var i = 0; i <= 255; i++) {
    if ((i^(i>>1)) == f[19]) {
        f[19] = i
        break
    }
}
f[25]=f[25]<<7&0xff|f[25]>>1
f[2]^=f[1]
f[19]^=f[12]
f[12]+=f[8],f[12]&=0xff
f[17]^=f[13]
f[21]^=f[5]
// f[6]=f[6]^(f[6]>>1)
for (var i = 0; i <= 255; i++) {
    if ((i^(i>>1)) == f[6]) {
        f[6] = i
        break
    }
}
f[8]^=f[1]
f[15]+=f[8],f[15]&=0xff
f[9]^=f[6]
f[13]^=f[2]
f[14]=f[14]<<1&0xff|f[14]>>7
f[1]=f[1]<<7&0xff|f[1]>>1
f[15]^=f[20]
f[21]-=f[0],f[21]&=0xff
f[8]+=f[18],f[8]&=0xff
f[10]-=f[22],f[10]&=0xff
f[8]+=f[17],f[8]&=0xff
f[7]^=f[21]
f[17]=f[17]<<7&0xff|f[17]>>1
f[29]=f[29]<<7&0xff|f[29]>>1
f[0]=f[0]<<7&0xff|f[0]>>1
f[4]=f[4]<<7&0xff|f[4]>>1
f[18]-=f[25],f[18]&=0xff
f[22]+=f[23],f[22]&=0xff
f[17]^=f[12]
f[20]^=f[5]
f[18]=f[18]<<1&0xff|f[18]>>7
f[28]+=f[0],f[28]&=0xff
f[21]-=f[25],f[21]&=0xff
f[7]=f[7]<<1&0xff|f[7]>>7
f[19]=f[19]<<7&0xff|f[19]>>1
// f[1]=f[1]^(f[1]>>1)
for (var i = 0; i <= 255; i++) {
    if ((i^(i>>1)) == f[1]) {
        f[1] = i
        break
    }
}
f[9]=~f[9]&0xff
f[24]^=f[25]
// f[9]=f[9]^(f[9]>>1)
for (var i = 0; i <= 255; i++) {
    if ((i^(i>>1)) == f[9]) {
        f[9] = i
        break
    }
}
f[10]+=f[9],f[10]&=0xff
f[3]=f[3]<<1&0xff|f[3]>>7
f[22]=f[22]<<1&0xff|f[22]>>7
f[8]-=f[16],f[8]&=0xff
f[24]^=f[27]
f[20]=f[20]<<7&0xff|f[20]>>1
f[29]+=f[21],f[29]&=0xff
f[4]^=f[2]
f[5]^=f[3]
f[9]^=f[26]
f[25]+=f[4],f[25]&=0xff
// f[5]=f[5]^(f[5]>>1)
for (var i = 0; i <= 255; i++) {
    if ((i^(i>>1)) == f[5]) {
        f[5] = i
        break
    }
}
f[4]-=f[18],f[4]&=0xff
f[1]=(((f[1]*0x0802&0x22110)|(f[1]*0x8020&0x88440))*0x10101>>>16)&0xff
f[8]=~f[8]&0xff
f[16]^=f[11]
f[4]=f[4]<<7&0xff|f[4]>>1
f[20]-=f[24],f[20]&=0xff
// f[20]=f[20]^(f[20]>>1)
for (var i = 0; i <= 255; i++) {
    if ((i^(i>>1)) == f[20]) {
        f[20] = i
        break
    }
}
f[10]=f[10]<<1&0xff|f[10]>>7
f[6]=~f[6]&0xff
// f[2]=f[2]^(f[2]>>1)
for (var i = 0; i <= 255; i++) {
    if ((i^(i>>1)) == f[2]) {
        f[2] = i
        break
    }
}
f[12]=f[12]<<1&0xff|f[12]>>7
f[12]=f[12]<<7&0xff|f[12]>>1
f[15]=~f[15]&0xff
f[4]^=f[18]
f[9]-=f[28],f[9]&=0xff
f[1]=f[1]<<1&0xff|f[1]>>7
f[11]=~f[11]&0xff
f[25]-=f[4],f[25]&=0xff
f[12]^=f[4]
f[15]+=f[17],f[15]&=0xff
f[25]^=f[28]
f[26]+=f[14],f[26]&=0xff
f[19]=f[19]<<1&0xff|f[19]>>7
// f[8]=f[8]^(f[8]>>1)
for (var i = 0; i <= 255; i++) {
    if ((i^(i>>1)) == f[8]) {
        f[8] = i
        break
    }
}
f[10]+=f[22],f[10]&=0xff
f[28]^=f[0]
f[6]^=f[5]
f[6]-=f[28],f[6]&=0xff
f[11]=f[11]<<1&0xff|f[11]>>7
f[14]=(((f[14]*0x0802&0x22110)|(f[14]*0x8020&0x88440))*0x10101>>>16)&0xff
f[25]=(((f[25]*0x0802&0x22110)|(f[25]*0x8020&0x88440))*0x10101>>>16)&0xff
f[12]+=f[3],f[12]&=0xff
f[28]=f[28]<<7&0xff|f[28]>>1
f[8]=f[8]<<7&0xff|f[8]>>1
f[16]+=f[9],f[16]&=0xff
f[19]=f[19]<<7&0xff|f[19]>>1
f[3]=(((f[3]*0x0802&0x22110)|(f[3]*0x8020&0x88440))*0x10101>>>16)&0xff
f[9]^=f[28]
f[11]=f[11]<<7&0xff|f[11]>>1
f[1]=f[1]<<1&0xff|f[1]>>7
f[2]=~f[2]&0xff
f[12]^=f[1]
f[10]^=f[0]
f[5]^=f[13]
f[13]^=f[1]
f[17]=f[17]<<1&0xff|f[17]>>7
f[9]^=f[2]
f[27]=(((f[27]*0x0802&0x22110)|(f[27]*0x8020&0x88440))*0x10101>>>16)&0xff
f[14]=~f[14]&0xff
f[1]^=f[28]
f[0]^=f[1]
f[1]-=f[13],f[1]&=0xff
f[14]-=f[9],f[14]&=0xff
f[25]^=f[21]
f[16]+=f[3],f[16]&=0xff
f[17]=f[17]<<7&0xff|f[17]>>1
f[17]+=f[18],f[17]&=0xff
f[26]=(((f[26]*0x0802&0x22110)|(f[26]*0x8020&0x88440))*0x10101>>>16)&0xff
f[4]+=f[29],f[4]&=0xff
f[21]^=f[22]
f[14]+=f[2],f[14]&=0xff
f[22]+=f[5],f[22]&=0xff
f[1]^=f[18]
f[3]-=f[28],f[3]&=0xff
f[7]+=f[6],f[7]&=0xff
f[6]+=f[17],f[6]&=0xff
f[5]-=f[15],f[5]&=0xff
f[6]=~f[6]&0xff
f[7]=f[7]<<1&0xff|f[7]>>7
f[9]-=f[16],f[9]&=0xff
f[11]=f[11]<<1&0xff|f[11]>>7
f[23]=f[23]<<1&0xff|f[23]>>7
f[3]+=f[22],f[3]&=0xff
f[17]=f[17]<<1&0xff|f[17]>>7
f[2]^=f[15]
f[2]=f[2]<<1&0xff|f[2]>>7
// f[14]=f[14]^(f[14]>>1)
for (var i = 0; i <= 255; i++) {
    if ((i^(i>>1)) == f[14]) {
        f[14] = i
        break
    }
}
f[25]+=f[22],f[25]&=0xff
f[28]=f[28]<<7&0xff|f[28]>>1
f[1]+=f[10],f[1]&=0xff
f[13]-=f[9],f[13]&=0xff
f[16]^=f[6]
f[24]+=f[7],f[24]&=0xff
// f[14]=f[14]^(f[14]>>1)
for (var i = 0; i <= 255; i++) {
    if ((i^(i>>1)) == f[14]) {
        f[14] = i
        break
    }
}
f[17]=f[17]<<1&0xff|f[17]>>7
f[17]=f[17]<<7&0xff|f[17]>>1
f[14]=~f[14]&0xff
f[0]+=f[4],f[0]&=0xff
f[1]+=f[13],f[1]&=0xff
f[6]^=f[1]
f[9]-=f[20],f[9]&=0xff
f[15]+=f[2],f[15]&=0xff
// f[13]=f[13]^(f[13]>>1)
for (var i = 0; i <= 255; i++) {
    if ((i^(i>>1)) == f[13]) {
        f[13] = i
        break
    }
}
f[18]=~f[18]&0xff
f[11]=f[11]<<1&0xff|f[11]>>7
f[17]=f[17]<<1&0xff|f[17]>>7
f[3]=f[3]<<7&0xff|f[3]>>1
f[15]^=f[20]
// f[28]=f[28]^(f[28]>>1)
for (var i = 0; i <= 255; i++) {
    if ((i^(i>>1)) == f[28]) {
        f[28] = i
        break
    }
}
// f[20]=f[20]^(f[20]>>1)
for (var i = 0; i <= 255; i++) {
    if ((i^(i>>1)) == f[20]) {
        f[20] = i
        break
    }
}
f[24]=f[24]<<7&0xff|f[24]>>1
f[22]+=f[2],f[22]&=0xff
f[2]-=f[5],f[2]&=0xff
f[7]=~f[7]&0xff
f[29]+=f[9],f[29]&=0xff
f[6]-=f[17],f[6]&=0xff
f[6]+=f[1],f[6]&=0xff
f[0]+=f[11],f[0]&=0xff
f[2]-=f[5],f[2]&=0xff
f[25]-=f[12],f[25]&=0xff
f[15]=f[15]<<7&0xff|f[15]>>1
f[25]=f[25]<<1&0xff|f[25]>>7
f[12]^=f[14]
// f[25]=f[25]^(f[25]>>1)
for (var i = 0; i <= 255; i++) {
    if ((i^(i>>1)) == f[25]) {
        f[25] = i
        break
    }
}
f[10]-=f[24],f[10]&=0xff
f[2]-=f[6],f[2]&=0xff
f[20]+=f[24],f[20]&=0xff
f[11]^=f[2]
f[20]=~f[20]&0xff
f[20]=f[20]<<1&0xff|f[20]>>7
f[20]=f[20]<<1&0xff|f[20]>>7
f[1]=f[1]<<1&0xff|f[1]>>7
f[4]+=f[18],f[4]&=0xff
f[29]+=f[24],f[29]&=0xff
f[24]-=f[14],f[24]&=0xff
f[8]^=f[9]
f[11]-=f[8],f[11]&=0xff
f[16]=f[16]<<7&0xff|f[16]>>1
f[26]-=f[22],f[26]&=0xff
f[4]-=f[3],f[4]&=0xff
f[23]=~f[23]&0xff
f[11]+=f[20],f[11]&=0xff
f[7]+=f[6],f[7]&=0xff
f[11]=f[11]<<1&0xff|f[11]>>7
f[16]=f[16]<<7&0xff|f[16]>>1
f[13]+=f[18],f[13]&=0xff
f[4]=~f[4]&0xff
f[1]+=f[4],f[1]&=0xff
f[29]=f[29]<<1&0xff|f[29]>>7
f[14]^=f[21]
f[26]=f[26]<<1&0xff|f[26]>>7
f[5]=f[5]<<7&0xff|f[5]>>1
f[13]+=f[3],f[13]&=0xff
f[4]^=f[15]
f[22]=f[22]<<1&0xff|f[22]>>7
f[15]^=f[20]
f[10]^=f[29]
f[5]+=f[7],f[5]&=0xff
// f[4]=f[4]^(f[4]>>1)
for (var i = 0; i <= 255; i++) {
    if ((i^(i>>1)) == f[4]) {
        f[4] = i
        break
    }
}
f[8]=f[8]<<7&0xff|f[8]>>1
f[18]+=f[29],f[18]&=0xff
f[26]+=f[0],f[26]&=0xff
f[26]+=f[7],f[26]&=0xff
f[13]=~f[13]&0xff
f[14]-=f[29],f[14]&=0xff
f[16]-=f[13],f[16]&=0xff
f[0]=~f[0]&0xff
f[28]=~f[28]&0xff
f[11]=f[11]<<7&0xff|f[11]>>1
// f[16]=f[16]^(f[16]>>1)
for (var i = 0; i <= 255; i++) {
    if ((i^(i>>1)) == f[16]) {
        f[16] = i
        break
    }
}
f[9]^=f[4]
f[9]^=f[1]
// f[15]=f[15]^(f[15]>>1)
for (var i = 0; i <= 255; i++) {
    if ((i^(i>>1)) == f[15]) {
        f[15] = i
        break
    }
}
// f[23]=f[23]^(f[23]>>1)
for (var i = 0; i <= 255; i++) {
    if ((i^(i>>1)) == f[23]) {
        f[23] = i
        break
    }
}
f[20]=f[20]<<1&0xff|f[20]>>7
f[2]=~f[2]&0xff
f[6]=f[6]<<1&0xff|f[6]>>7
f[3]^=f[11]
f[29]=~f[29]&0xff
f[17]-=f[5],f[17]&=0xff

console.log("f = " + f)
out = ''
for (let i of f) {
    out += String.fromCharCode(i)
}
console.log(out)


1678692842955-d36157cd-9165-432c-b902-187299c1f718.png

[Plain Text] 纯文本查看 复制代码
hxp{Cann0t_f1nd_m0dule_'fl4g'}



0x04 题目下载

required.zip (67.7 KB, 下载次数: 23)

免费评分

参与人数 7威望 +2 吾爱币 +104 热心值 +7 收起 理由
涛之雨 + 2 + 100 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
diffany + 1 + 1 我很赞同!
ovohuang + 1 + 1 热心回复!
asas1010 + 1 + 1 用心讨论,共获提升!
999877 + 1 谢谢@Thanks!
daocaorenpp + 1 我很赞同!
Lucifer_BW + 1 + 1 热心回复!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

liwei518 发表于 2023-3-15 18:51
chayan插言插言
afo2023 发表于 2023-3-15 19:44
hanghaidongchen 发表于 2023-3-15 20:50
LYQ12345 发表于 2023-3-16 01:11
66666666666666666666666666666666
zi0wi15on 发表于 2023-3-16 08:41
感想分享,奇怪的知识增加了
hummel 发表于 2023-3-16 09:16
感谢楼主分享,顶一个!
xixicoco 发表于 2023-3-17 04:56
good,我是做不出来这题
MMM2042 发表于 2023-3-17 08:50
感谢分享,支持一下!
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-15 15:48

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表