打开图片,只有四种数字:127,191,63,255
最大数字为255,想到进制转换
将其均转换为二进制:
发现只有前2位不一样
想着把每个数的前俩位提取出来,组成新的二进制,然后每八位一组,再转字符
import binascii #该模块处理二进制和ASCII转换
with open('ttl.txt', 'r') as file: #以只读方式打开文件
lines = file.readlines() #返回列表,读取所有行
ttl_data = ''
for line in lines:
prefix = "{0:b}".format(int(line[4:])).zfill(8)
#"{0:b}".format()格式化字符串,将传入参数格式化为二进制。int(line[4:])从line中取出从索引4到末尾的全部字符,并转换为整数。
# .zfill(8)得到的字符串右对齐,不足八位补0。
ttl_data += prefix[0:2] #获取prefix的前俩位字符
flag = ''
for i in range(0, len(ttl_data), 8): #步长为8,每次处理8个二进制数
flag += chr(int(ttl_data[i:i + 8], 2)) #将8个二进制数转换为字符,2表示输入的数是二进制
print(flag)
# 发现flag为图片的文件头
flag = binascii.unhexlify(flag) #函数用于将十六进制表示的ASCII字符串(通常以0x开头,但在unhexlify中不需要)转换回其原始的二进制数据。
with open('./res.jpg', 'wb') as file:
file.write(flag)
拿到图片,残缺二维码,foremost分离以后拿到二维码碎片,拼图扫二维码拿到加密的flag,之后根据提示cipher解密,拿到flag