ACTF新生赛_2020_rome
1.PEiD查看文件信息
发现没有壳,且为32位文件
2.IDA分析
![image-20221125154612263](https://i-blog.csdnimg.cn/blog_migrate/29f559e1569bf0e9168e4c312549e2a7.png)
输入的字符串要按照"ACTF{}" 的格式,
因为 v10 v11 v12 v13 都是 int 类型的变量,所以{}内的字符应该有 4*4=16 位
第一个 for 循环是对大写字母和小写字母进行不同的处理
第二个 for 循环是对处理后的字符串和 v15 进行比较,若相同,则成功
v15: “Qsw3sj_lz4_Ujw@l”
3.编写脚本
第一种:暴力枚举
v15 = "Qsw3sj_lz4_Ujw@l"
flag = ""
for i in range(0,16):
for j in range(0,127):# ASCII
x = j
if j > 64 and j <= 90:
j = (j - 51) % 26 + 65
if j > 96 and j <= 122:
j = (j - 79) % 26 + 97
if chr(j) == v15[i]:
flag += chr(x)
print(flag)
第二种:程序逆向
v12 ="Qsw3sj_lz4_Ujw@l"
v1 =list(v12)
for i in range(16):
if ord(v1[i])>64 and ord(v1[i])<=90:
v1[i]=chr(ord(v1[i])-65+51) if (ord(v1[i])-65+51)>64 else chr(ord(v1[i])-65+26+51)
if ord(v1[i])>96 and ord(v1[i])<=122:
v1[i]=chr(ord(v1[i])-97+79) if (ord(v1[i])-97+79)>96 else chr(ord(v1[i])-97+26+79)
print("".join(v1))
成功得到flag
flag:Cae3ar_th4_Gre@t