按CTRL + X 跳转到main函数,按F5 生成伪代码进行分析。
发现一个加密函数,当加密后的数据和genc[i]数组中的值对比一致则表示正确flag,字符串长度为35。
双击genc[i] 找到genc[i]中的数据,转成10进制得到数组
genc=[172,102,148,227,47,163,83,255,156,61,182,107,233,233,87,185,7,181,214,59,179,8,181,143,29,197,72,187,163,77,188,113,151,241,104]
分析 当输入的字符串,每次取5个,且下标为0,1,2,3,4的5个字母分别,异或gkey,byte_4021,byte_4022,byte_4023,byte_4024,byte_4025变量的值。
双击gkey就能找到这个变量的值
最后5个字母再异或byte_4025 ,且每次减1。逻辑如下,依次循环:
genc[0]^(byte_4025-0)^gkey)
genc[1]^(byte_4025-1)^byte_4021
genc[2]^(byte_4025-2)^byte_4022
genc[3]^(byte_4025-3)^byte_4023
genc[4]^(byte_4025-4)^byte_4024
生成代码
genc=[172,102,148,227,47,163,83,255,156,61,182,107,233,233,87,185,7,181,214,59,179,8,181,143,29,197,72,187,163,77,188,113,151,241,104]
gkey = 179
byte_4021 = 125
byte_4022 = 158
byte_4023 = 248
byte_4024 = 44
byte_4025 = 91
a=''
for i in range(0,34,5):
a+=(chr(genc[i] ^ (byte_4025-i )^ gkey))
i+=1
a+=(chr(genc[i] ^ (byte_4025 - i) ^ byte_4021))
i+= 1
a+=(chr(genc[i] ^ (byte_4025 - i) ^ byte_4022))
i += 1
a+=(chr(genc[i] ^ (byte_4025 - i) ^ byte_4023))
i+= 1
a+=(chr(genc[i] ^ (byte_4025 - i) ^ byte_4024))
print(a)
DASCTF{57CTF8_6F1ag_G3n3r4ted_2023}