【CTF misc】buu-zip-枚举文件内容比对CRC32+识别rar文件头

602 阅读3分钟

环境

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。

参考链接

  1. www.cnblogs.com/harmonica11…