看py题目发现主要是调用了trytry函数和whereistheflag函数!
whereThel1b.whereistheflag(flag)
ret = whereThel1b.trytry(flag)
动态调试发现whereThel1b.whereistheflag(flag)这个东西所输出的东西是随机无用的!
那么接下来就是使用ida动态调试trytry函数来看看加密逻辑了!
发现trytry的作用貌似是设置了随机数种子seed!
trytry - 》whereistheflag1,发现调用了whereistheflag1
感觉加密逻辑就在这里了!发现base64加密
这里生成了随机数!跟之前的随机数种子呼应!
这里应该是获取随机数!
这里进行了异或操作!,运行之后就会陷入下一个循环继续进行随机数获取和xor操作了!
然后就进行了返回操作whereistheflag1就结束了
很显然这道题的加密逻辑:
- 先设置随机数0
- 在进行base64加密
- 再通过随机数获取出keylist,在进行异或就算完整的加密过程了!、
先写个脚本测试一下,加密算法:
import whereThel1b
import base64
#flag1 = input("where is my flag:")
arrlist = []
encry = [108, 117, 72, 80, 64, 49, 99, 19, 69, 115, 94, 93, 94, 115, 71, 95, 84, 89, 56, 101, 70, 2, 84, 75, 127, 68, 103, 85, 105, 113, 80, 103, 95, 67, 81, 7, 113, 70, 47, 73, 92, 124, 93, 120, 104, 108, 106, 17, 80, 102, 101, 75, 93, 68, 121, 26]
def fun(flag):
value = []
whereThel1b.whereistheflag(flag)
ret = whereThel1b.trytry(flag)
tmp = base64.b64encode(flag)
print(tmp)
out = []
for i in tmp:
out.append(i)
print("输入:",out)
print("结果:",ret)
temp = []
for i in range(len(out)):
temp.append(out[i]^ret[i])
print("")
arrlist.append(temp)
idx = 1
while idx < 7 :
fun(b'f'*idx)
idx += 1
print(arrlist)
idx = 1
for list1 in arrlist:
print(idx,list1)
idx += 1
那么下面结果也就出来了!
解题py也就出来了!
import random
import base64
encry = [108, 117, 72, 80, 64, 49, 99, 19, 69, 115, 94, 93, 94, 115, 71, 95, 84, 89, 56, 101, 70, 2, 84, 75, 127, 68, 103, 85, 105, 113, 80, 103, 95, 67, 81, 7, 113, 70, 47, 73, 92, 124, 93, 120, 104, 108, 106, 17, 80, 102, 101, 75, 93, 68, 121, 26]
keylist = []
random.seed(0)
for ch in range(len(encry)):
keylist.append(random.randint(0, len(encry)))
flag = []
for i in range(len(encry)):
flag.append(keylist[i] ^ encry[i])
# 将 flag 转换为字符列表并连接成字符串
flag_str = ''.join(map(chr, flag))
# 将生成的字符串编码为字节
flag_bytes = flag_str.encode()
# 使用 Base64 解码字节并打印
decoded = base64.b64decode(flag_bytes)
print(decoded)