参考视频:
Jamiexu793的个人空间-Jamiexu793个人主页-哔哩哔哩视频
代码分析:
其主要内容在两个while循环中(从定义中可知flag位16个字符)。
看第二个循环,可知是比较result和经过第一个循环得到的v1比较(就是flag经过第一个循环后变成了result(v12))并且可以从开头看出v12=Qsw3sj_lz4_Ujw@l。
再看第一个循环,发现是凯撒密码(看了老半天),大写字母平移12位,小写字母平移8位,其他字符不变。
import z3
key="Qsw3sj_lz4_Ujw@l"solver=z3.Solver()varNames=[]
for i in key:o=ord(i)if o>64 and o<=90:x=z3.Int('v%d'%o)solver.add(x>64)solver.add(x<=90)solver.add(((x-51)%26+65)==o)varNames.append(x)elif o>96 and o<=122:x=z3.Int('v%d'%o)solver.add(x>96)solver.add(x<=122)solver.add(((x-79)%26+97)==o)varNames.append(x)else:x=z3.Int('v%d'%o)solver.add(x==o)varNames.append(x)
if solver.check()==z3.sat:model=solver.model()for i in varNames:print(chr(model[i].as_long()),end='')
#Cae3ar_th4_Gre@t
#ACTF{Cae3ar_th4_Gre@t}
ACTF{Cae3ar_th4_Gre@t}