bugku - 好多壓縮包 - Writeup
M4x原創,轉載請注明出處
這道題前前后后做了好幾天,這里記錄一下
題目
分析
- 解壓下載后的文件,發現有68個壓縮文件,並且每個壓縮文件里都有一個4個字節大小的名為data.txt的txt文件,於是嘗試用crc32碰撞還原出所有壓縮包中的文件內容
腳本如下:
1 #coding:utf-8 2 import zipfile 3 import string 4 import binascii 5 6 def CrackCrc(crc): 7 for i in dic: 8 for j in dic: 9 for p in dic: 10 for q in dic: 11 s = i + j + p + q 12 if crc == (binascii.crc32(s) & 0xffffffff): 13 #print s 14 f.write(s) 15 return 16 17 def CrackZip(): 18 for I in range(68): 19 file = 'out' + str(I) + '.zip' 20 f = zipfile.ZipFile(file, 'r') 21 GetCrc = f.getinfo('data.txt') 22 crc = GetCrc.CRC 23 #以上3行為獲取壓縮包CRC32值的步驟 24 #print hex(crc) 25 CrackCrc(crc) 26 27 dic = string.ascii_letters + string.digits + '+/=' 28 29 f = open('out.txt', 'w') 30 CrackZip() 31 f.close()
腳本運行時間較長
CRC32碰撞的原理請翻到這篇文章的0x06部分
步驟
-
根據碰撞出內容的格式(末尾兩個==)推斷這段數據是base64編碼過的,先解碼,根據解碼結果中的flag.txt推斷這可能是一個壓縮包,同時根據fix the file and get the flag知需要修復文件
-
將解碼后的文件導入16進制編輯器(如010editor),觀察數據,發現存在rar的文件尾C43D7B00400700,但缺少文件頭,於是補上rar的文件頭526172211A0700。
-
另存為rar格式,發現文件修復成功,解壓后發現一個txt文檔如下
-
文件已經修復但還沒發現flag,仔細尋找,在注釋里找到了flag
於是flag即為flag{nev3r_enc0de_t00sm4ll_fil3w1th_zip}
后來經大神提示,根據rar的文件結構可以看出還存在一個名為CMT的文件,CMT即為comment,即為注釋