题目信息

点击还原比赛场景后,会给出镜像服务器的ip以及连接端口。且提示:“只有真正的hacker才能看到这张图片”

分析

连接上服务器之后,服务器返回的数据看上去像base64编码,对此,解码即可;根据题目的提示,flag藏在图片中,解码后文件头数据不是png,jpg,bmp文件头格式(说明不是直接解码这么简单),也不是zip,rar,7z文件头格式(说明不是将图片加密压缩);实际上,原比赛的此题还有一个Python脚本,大致意思是使用长度为12的密钥与图片数据进行(循环)异或加密,有了这个信息之后,尝试使用各种图片格式的文件头与加密数据进行异或得到密钥,使用png格式的文件头与加密数据进行异或时,得到的结果“很像”密钥;接下来使用密钥解密即可。

解题

首先从服务器接收全部的数据,再进行base64解码(将解码后的数据存入文件data);

然后通过png文件头解出密钥,然后通过密钥解密,实现的Python脚本如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from base64 import b64decode
from binascii import unhexlify
from Crypto.Util.strxor import strxor

def enc(data,key):
key=(key*(len(data)/len(key)+1))[:len(data)]
return strxor(data,key)

def solve(data):
head=unhexlify('89504e470d0a1a0a0000000d49484452')
key=strxor(head,data[:16])
with open('sleeping-guard.png','wb') as f:
f.write(enc(data,key[:12]))

if __name__=='__main__':
with open('data','rb') as f:
solve(f.read())

最后解密出图片