环境
Windows10,python3.7.6
writeup
作者:hans774882968以及hans774882968
这题给了编号0~67的68个zip压缩包。每个都需要密码且无法得知,并且每个压缩包里有一个data.txt,只有4字节。
CRC32可以校验文件内容是否发生改变,又因为每个文件只有4字节,因此可以直接枚举文件内容,看哪个文件内容的CRC32是正确的。
利用zipfile模块可以很方便地拿到zip内文件的CRC;利用binascii(python3.7无需安装,直接用)可以计算CRC32。
import binascii
import itertools
import zipfile
ALPH = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="
def get_file_content(goal_crc):
strs = itertools.product(ALPH,repeat = 4)
for t in strs:
s = "".join(t)
if binascii.crc32(s.encode()) == goal_crc:
return s
raise Exception("get content failed!")
def main():
ans = ""
for i in range(0,67 + 1):
fname = f"out{i}.zip"
goal_crc = zipfile.ZipFile(fname,"r").getinfo("data.txt").CRC
strs = itertools.product(ALPH,repeat = 4)
content = get_file_content(goal_crc)
print(i,content)
ans += content
print(f"ans = {ans}")
if __name__ == "__main__":
main()
于是我们得到一串base64字符串。题干说这玩意解码一下就是答案,但并不是……扔在线工具解码会报错,因为有不可见字符。因此我们用python,把它先解码为16进制。
cf907300000d00000000000000aa3e7a008023004900000054000000028634abfe6b631d491d33030001000000434d54091514cbdd414f952448d3e88f984511514146f79f1d20427c6d2bb869ca9f282c3328fc4816991f1b181d8f382c4676e1c5ed674d72de4d4ad58274be92bd1f0a94cdbeaef73f22804af77420902d001d0000001d0000000262d1e7d54f631d491d30080020000000666c61672e74787400b0346966666978207468652066696c6520616e64206765742074686520666c6167c43d7b00400700
根据参考链接1,cf9073是rar文件头的一部分。对比rar的文件头,应该补上开头几个字节52 61 72 21 1A 07 00。namo我们可以写一小段py生成这个rar。
import base64
b64_data = "z5BzAAANAAAAAAAAAKo+egCAIwBJAAAAVAAAAAKGNKv+a2MdSR0zAwABAAAAQ01UCRUUy91BT5UkSNPoj5hFEVFBRvefHSBCfG0ruGnKnygsMyj8SBaZHxsYHY84LEZ24cXtZ01y3k1K1YJ0vpK9HwqUzb6u9z8igEr3dCCQLQAdAAAAHQAAAAJi0efVT2MdSR0wCAAgAAAAZmxhZy50eHQAsDRpZmZpeCB0aGUgZmlsZSBhbmQgZ2V0IHRoZSBmbGFnxD17AEAHAA=="
temp = base64.b64decode(b64_data).hex()# base64解码为hex
print(temp)
v = bytes.fromhex(f"526172211A0700{temp}")
with open("want2.rar","wb") as f:
f.write(v)
最后我要说的和参考链接1不一样。实际上,直接用WinRAR打开want2.rar,看右侧信息就可以拿到flag了。把7A改为74以后,反而WinRAR报“文件头已损坏”,只不过也可以拿到flag。