前言
前言这玩意真好用,比写文件类型好多了😐
C++ STL库写的所以代码看着都比较长,不过带着gpt分析也不是太麻烦,昨天的蓝桥国赛比这难,果然菜鸡不配打算法比赛
主函数分析
分析了,一下加密内容主要位于lamba匿名函数中和depart函数
匿名函数我理解的是函数名为lamba,参数数量任意的函数
前面这部分主要是为了如果输入的是正确的的flag便于后面输出字符串,加密过程中并不会用到,结尾处可以看到输入的整数都被进行了压栈处理
中间对basic_string函数分析出了点错误,因为unk不知道数据类型,但应该是大小或者初始值一类的东西
第一个lamba
主要进行xor操作
depart
说实话我没看懂分解原理,话说应该也没有可以求质数的公式,应该是用的暴力循环
质因数分解的过程如下:
起始质数为2。
20可以整除2,所以2是20的一个质因数。
商为10,继续对10进行质因数分解。
10可以整除2,所以2是10的一个质因数。
商为5,继续对5进行质因数分解。
5本身就是一个质数,所以5是5的质因数。
商为1,分解结束。
将质因数2、2、5按照从小到大排列,得到20的质因数分解结果为2 * 2 * 5。
第二个lamba
使用std::replace函数对字符串a2进行多次字符替换操作,将指定字符替换为相应的替换字符。
- 替换字符’O’替换为’0’。
- 替换字符’l’替换为’1’。
- 替换字符’z’替换为’2’。
- 替换字符’E’替换为’3’。
- 替换字符’A’替换为’4’。
- 替换字符’s’替换为’5’。
- 替换字符’G’替换为’6’。
- 替换字符’T’替换为’7’。
- 替换字符’B’替换为’8’。
- 替换字符’q’替换为’9’。
- 替换字符’='替换为空格字符。
第三个lamba
可以看到一个比较函数,说明结果在ans里面,直接看不到值,需要动调。。呸,交叉引用也可以定位到,每次是真不想动调linux的文件,问题贼多
wp
所以将这些字符串转回去,然后每个字符串相乘后异或1
import hashlib
st1 = ["=zqE=z=z=z", "=lzzE", "=ll=T=s=s=E", "=zATT", "=s=s=s=E=E=E", "=EOll=E", "=lE=T=E=E=E", "=EsE=s=z", "=AT=lE=ll"]
def replace_chars(str):
str = str.replace("O", "0")
str = str.replace("l", "1")
str = str.replace("z", "2")
str = str.replace("E", "3")
str = str.replace("A", "4")
str = str.replace("s", "5")
str = str.replace("G", "6")
str = str.replace("T", "7")
str = str.replace("B", "8")
str = str.replace("q", "9")
str = str.replace("=", " ")
return str
temp = ""
for i in range(len(st1)):
flag = 1
out = replace_chars(st1[i]).split(" ")[1:]
print(out)
for j in out:
flag *= int(j)
print(hex(flag))
flag ^= 1
temp += str(flag)
print(temp)
m =hashlib.md5()
m.update(temp.encode('utf-8'))
print("flag{",end="")
print(m.hexdigest().upper(),end="")
print("}")
flag{4367FB5F42C6E46B2AF79BF409FB84D3}