Bugku-Misc-好多壓縮包(CRC32碰撞)


8 個金幣欸心疼,在此記錄一下這個金貴的題目

簡介

循環冗余校驗(Cyclic Redundancy Check, CRC)是一種根據網絡數據包或計算機文件等數據產生簡短固定位數校驗碼的一種信道編碼技術,主要用來檢測或校驗數據傳輸或者保存后可能出現的錯誤。它是利用除法及余數的原理來作錯誤偵測的。----百度百科

每個文件都有唯一的 CRC32 值,即使文件中有個一個 bit 發生了變化,CRC32 值也會不同。CRC32 爆破:知道文件中一段數據的長度和文件的 CRC32 值,通過編寫腳本程序,利用窮舉法,與其 CRC32 對照,從而達到猜解數據的目的(通常只適用於較小的文本文件,文件太大窮舉難度太大)。

題解

下載附件,解壓得到 68 個壓縮包,並且每個壓縮文件里都有一個 4 個字節大小的名為 data.txt 的 txt 文件,於是嘗試用 crc32 碰撞還原出所有壓縮包中的文件內容

腳本如下:

#coding:utf-8
import zipfile
import string
import binascii

def CrackCrc(crc):
    for i in dic:
        for j in dic:
            for p in dic:
                for q in dic:
                    s = i + j + p + q
                    if crc == (binascii.crc32(s) & 0xffffffff):
                        #print s
                        f.write(s)
                        return

def CrackZip():
    for I in range(68):
        file = 'out' + str(I) + '.zip'
        f = zipfile.ZipFile(file, 'r')
        GetCrc = f.getinfo('data.txt')
        crc = GetCrc.CRC
        #以上3行為獲取壓縮包CRC32值的步驟
        #print hex(crc)
        CrackCrc(crc)

dic = string.ascii_letters + string.digits + '+/='

f = open('out.txt', 'w')
CrackZip()
f.close()

得到如下內容:

z5BzAAANAAAAAAAAAKo+egCAIwBJAAAAVAAAAAKGNKv+a2MdSR0zAwABAAAAQ01UCRUUy91BT5UkSNPoj5hFEVFBRvefHSBCfG0ruGnKnygsMyj8SBaZHxsYHY84LEZ24cXtZ01y3k1K1YJ0vpK9HwqUzb6u9z8igEr3dCCQLQAdAAAAHQAAAAJi0efVT2MdSR0wCAAgAAAAZmxhZy50eHQAsDRpZmZpeCB0aGUgZmlsZSBhbmQgZ2V0IHRoZSBmbGFnxD17AEAHAA==

base64 decode 得到:

解碼出來的字符串提示包含關鍵字 flag.txt,及字符串 “fix the file and get the flag” 提示修復文件,這里猜測應該是某種文件,但是頭尾不完整需要補充

注意到結尾處存在 rar 的文件尾 C43D7B00400700,但缺少文件頭,於是補上 rar 的文件頭 526172211A0700,保存為新文件得到 flag

flag{nev3r_enc0de_t00_sm4ll_fil3_w1th_zip}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM