文章目录
  1. 题目信息
  2. 分析
  3. 解题

题目信息

题目无描述。

分析

通过对加密脚本的分析可知需通过PNG文件格式与最后的填充破解出密钥,PNG文件格式详细介绍在此;大致来说,每个PNG文件的开头都是一串固定的字节来表明其PNG文件格式,你并不需要确切知道这些字节是什么,只需要找一张可正常打开的PNG文件即可!然而,仅通过PNG文件头无法破解密钥的全部24字节,于是还需要借助加密前的填充操作,填充是一串长度相同的字节,且字节的值等于这串字节的长度,通过结合这两点,即可破解出key全部24个字节。

解题

如下是解题的Python脚本(找一张可正常打开的PNG文件,命名为sample.png于同目录下):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
def solve():
with open('BITSCTFfullhd.png','rb') as f:
d=f.read()
with open('sample.png','rb') as f:
dd=f.read(24)
pre_k=bytes([s^t for s,t in zip(d[:24],dd)])
me=bytes([s^t for s,t in zip(pre_k,d[-24:])])
L=max(me,key=me.count)
end_k=bytes([s^t for s,t in zip(L.to_bytes(1,'little')*L,d[-L:])])
key=pre_k[:-L]+end_k
ld=len(d)
assert not ld%24
m=bytes([s^t for s,t in zip(d,key*(ld//24))])
with open('FLAG.png','wb') as f:
f.write(m[:-L])
return

if __name__=='__main__':
solve()
print('done!')

程序运行后会在目录下生成FLAG.png,打开即可见flag。