循環冗余效驗(Cyclic Redundancy Check, CRC)
是一種根據網絡數據包或電腦文件等數據產生簡短固定位數校驗碼的一種散列函數,主要用來檢測或校驗數據傳輸或者保存后可能出現的錯誤。它是利用除法及余數的原理來作錯誤偵測的。
原理:
循環冗余校驗同其他差錯檢測方式一樣,通過在要傳輸的k比特數據D后添加(n-k)比特冗余位(又稱幀檢驗序列,Frame Check Sequence,FCS)F形成n比特的傳輸幀T,再將其發送出去。
特別的,循環冗余校驗提供一個預先設定的(n-k+1)比特整數P,並且要求添加的(n-k)比特F滿足:
T mod P == 0 ……(1)
T = 2n-kD + F …… (2)
基於上述要求,實際應用時,發送方和接收方按以下方式通信:
1、發送方和接收方在通信前,約定好預設整數P
2.、發送方在發送前通過(1)和(2)式確定並填充F,然后發送。
3、 接收方收到數據,進行 result = T mod P 運算,當且僅當result = 0時接收方認為沒有差錯。
發送方在發送數據前需要確定填充的(n-k)比特F
——原理摘自百度百科
xman Misc-1
題目:
1、特征
- 一般有很多zip的壓縮包,
- 解壓需要密碼,且密碼復雜,不可爆破
- 每個包很小,僅幾k
2、思路
由於文件很小只幾個字節,可以對其中的內容進行窮舉,窮舉后計算crc並與原文件的crc碼對比。
3、writeup
將壓縮包解壓發現有很多chunkX.zip文件,並且里面都有data.txt文件。解壓需要密碼,嘗試爆破發現不成功。發現每個文件極小只幾k,進行crc碰撞。
腳本:
#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
def CrackZip():
for I in range(54):
file = 'chunk' + str(I) + '.zip'
f = zipfile.ZipFile(file, 'r')
GetCrc = f.getinfo('data.txt')
crc = GetCrc.CRC
#以上3行為獲取壓縮包CRC32值的步驟
CrackCrc(crc)
dic = string.ascii_letters + string.digits + '+/='
CrackZip()
碰撞得出每個文件的內容,如下:

UEsDBBQDAQAAAJFy1kgWujyNLwAAACMAAAAIAAAAZmxhZy50eHT/xhoeSnjMRLuArw2FXUAIWn8UQblChs4AF1dAnT4nB5hs2SkR4fTfZZRB56Bp/FBLAQI/AxQDAQAAAJFy1kgWujyNLwAAACMAAAAIAAAAAAAAAAAAIIC0gQAAAABmbGFnLnR4dFBLBQYAAAAAAQABADYAAABVAAAAAAA=
發現是base64解碼,但解碼出現亂碼,勾選結果以16進制顯示,並保存為zip格式。


解壓后還是要密碼,用Ziperello爆破,得密碼。

flag{i_z1pp3d_a_zip_w1th_sum_zips}
詳細CRC冗余效驗原理文章:
https://blog.csdn.net/qq_27312943/article/details/52723965