re学习(18)[ACTF新生赛2020]rome1(Z3库+window远程调试)

参考视频:

Jamiexu793的个人空间-Jamiexu793个人主页-哔哩哔哩视频

代码分析:

其主要内容在两个while循环中(从定义中可知flag位16个字符)。

看第二个循环,可知是比较result和经过第一个循环得到的v1比较(就是flag经过第一个循环后变成了result(v12))并且可以从开头看出v12=Qsw3sj_lz4_Ujw@l。

再看第一个循环,发现是凯撒密码(看了老半天),大写字母平移12位,小写字母平移8位,其他字符不变。

re学习(18)[ACTF新生赛2020]rome1(Z3库+window远程调试)_第1张图片

re学习(18)[ACTF新生赛2020]rome1(Z3库+window远程调试)_第2张图片

re学习(18)[ACTF新生赛2020]rome1(Z3库+window远程调试)_第3张图片 re学习(18)[ACTF新生赛2020]rome1(Z3库+window远程调试)_第4张图片

re学习(18)[ACTF新生赛2020]rome1(Z3库+window远程调试)_第5张图片

 

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}

你可能感兴趣的:(#,reverse,problem,学习)