python實現crc32爆破,得到加密文件內容

crc32爆破

基本原理

crc檢驗原理實際上就是一個p位二進制序列之後附加一個r位二進制檢驗碼(序列), 從而構成一個總長爲n=p+r位的二進制序列, 附加在數據序列之後的這個檢驗碼與數據序列的內容之間存在這某種特定的關係. 如果幹擾因素使數據序列中的某一位或者某些位發生變化,這種特定的關係就會被破壞, 因此通過這種特性可以利用來爆破文件的內容.

文件的內容只有相同的時候他的crc校驗纔會一樣.只要已知壓縮文件的長度已知就可以獲取他的crc32值來與我們的內容計算得到的值進行相互比較, 從而得到文件內容.(前提是文件內容長度夠小纔可以通過這種方法來實現,否則內容過長pc的算力有限)

現在有一個flag.zip 裏面有一個flag.txt 文件 密碼未知

使用模塊如下:

import string
import zipfile
import binascii

確定文件的長度

pig@deep:~/Desktop/crc32碰撞$ zipinfo flag.zip 
Archive:  flag.zip
Zip file size: 166 bytes, number of entries: 1
-rw-a--     6.3 fat        4 Bx stor 19-Oct-29 20:52 flag.txt
1 file, 4 bytes uncompressed, 4 bytes compressed:  0.0%

得到文件的內容爲4個字節長度

通過zipfile模塊來獲取當前壓縮文件的crc32的值

def getcrc():
    f = zipfile.ZipFile("flag.zip", "r")
    GetCrc = f.getinfo("flag.txt")
    crc = GetCrc.CRC
    jisuancrc(crc) // 將得到的crc的值傳遞給接下來需要計算crc的模塊

通過binascii模塊來計算crc的值並得到文件內容

def jisuancrc(crc):
    for a in dic:
        for b in dic:
            for c in dic:
                for d in dic:
                    s = a + b + c + d
                    s = str(s).encode() //注意python2和python3之間的編碼方式的不同, 如果是python2版本則不需要這行
                    if (binascii.crc32(s)) == crc: // 如果是python2還需要加上0xfffffff 使crc值都是正值,python3則不需要
                        print (s)
                        return

字典模塊通過string模塊得到

dic = string.ascii_letters + string.digits + '+-={}'

調用:

if __name__ = "__main__":
	getcrc()

運行結果

0x80e245d8
b'123a'
[Finished in 6.7s]

如果文件內容過長的話, 通過這種方式就不現實了.

通過bugku的一道: 好多壓縮包 題目實踐一下

解壓文件得到如下的壓縮文件

pig@deep:~/Desktop/123$ ls
out0.zip   out19.zip  out28.zip  out37.zip  out46.zip  out55.zip  out64.zip
out10.zip  out1.zip   out29.zip  out38.zip  out47.zip  out56.zip  out65.zip
out11.zip  out20.zip  out2.zip   out39.zip  out48.zip  out57.zip  out66.zip
out12.zip  out21.zip  out30.zip  out3.zip   out49.zip  out58.zip  out67.zip
out13.zip  out22.zip  out31.zip  out40.zip  out4.zip   out59.zip  out6.zip
out14.zip  out23.zip  out32.zip  out41.zip  out50.zip  out5.zip   out7.zip
out15.zip  out24.zip  out33.zip  out42.zip  out51.zip  out60.zip  out8.zip
out16.zip  out25.zip  out34.zip  out43.zip  out52.zip  out61.zip  out9.zip
out17.zip  out26.zip  out35.zip  out44.zip  out53.zip  out62.zip
out18.zip  out27.zip  out36.zip  out45.zip  out54.zip  out63.zip

得到每個壓縮包都是4個字節的大小, 壓縮的文件爲data.txt, 通過腳本得到文件內容, 腳本如下:

#!/usr/bin/python
# -*- coding=utf8 -*-
"""
# @Author : pig
# @CreatedTime:2020-01-22 21:44:34
# @Description : 
"""

import zipfile
import string
import binascii

def jisuan(crc):
    for a in dic:
        for b in dic:
            for c in dic:
                for d in dic:
                    s = a + b + c + d
                    s = str(s).encode()
                    if crc == (binascii.crc32(s)):
                        print (s)
                        f.write(s.decode('utf-8'))
                        return


def getcrc():
    for i in range(68):
        file = 'out' + str(i) + '.zip'
        f = zipfile.ZipFile(file, 'r')
        GetCrc = f.getinfo('data.txt')
        crc = GetCrc.CRC
        print (hex(crc))
        jisuan(crc)


dic = string.ascii_letters + string.digits + '+/='
f = open('out.txt', 'w+')
getcrc()
f.close()

運行結果部分如下:

0x75f90d3a
b'z5Bz'
0xbb21560
b'AAAN'
0x9b0d08f1
b'AAAA'
0x9b0d08f1
b'AAAA'
0x30fa0c4d
b'AKo+'
0xbaab6848
b'egCA'
0xc2a03377
b'IwBJ'
0x9b0d08f1
b'AAAA'
0x56c367d7
b'VAAA'
0x8881454e
b'AAKG'
0xf399b503
b'NKv+'
0x8a39ea8d
b'a2Md'
0xf8522b5f
b'SR0z'
0x22e2c069
b'AwAB'
0x9b0d08f1
b'AAAA'
0xabc2f082
b'Q01U'
0x1b10de7b
b'CRUU'
0x4246c91b
b'y91B'
0x5a277153
b'T5Uk'
0xe54efe07
b'SNPo'
0x65e4ea0a
b'j5hF'
0xdb4eed2e
b'EVFB'
0xac675758
b'Rvef'
0x3c84028a
b'HSBC'
0x2b91ca65
b'fG0r'
0x1200cac6
b'uGnK'
0x422dd115
b'nygs'
0xa40a3790
b'Myj8'
0x7cbac4f2
b'SBaZ'
0x33a35543
b'HxsY'
0x2aa2f2bf
b'HY84'
0xe5493ec
b'LEZ2'
0x3196a7ea
b'4cXt'
0x4e1b1b60
b'Z01y'
0xa00b3338
b'3k1K'
0x26f1c2c4
b'1YJ0'
0x776956ca
b'vpK9'
0x37f3cd7
b'HwqU'
0xc7e6946c
b'zb6u'
0xd6f0e0b6
b'9z8i'
0x533d25ef
b'gEr3'
0x20e4f175
b'dCCQ'
0x3e45a71b
b'LQAd'
0x9b0d08f1
b'AAAA'
0xfa23e40b
b'HQAA'
0x4d4c79c0
b'AAJi'
0x2edc1696
b'0efV'
0x4dcce21e
b'T2Md'
0x86e357e2
b'SR0w'
0xe3094587
b'CAAg'
0x9b0d08f1
b'AAAA'
0x6174723d
b'Zmxh'
0x5a3c911f
b'Zy50'
0xf14e1946
b'eHQA'
0xf7d5bb98
b'sDRp'
0xd5aaac4b
b'ZmZp'
0xbbf6f69f
b'eCB0'
0xc31189d5
b'aGUg'
0xc5bf6c84
b'Zmls'
0x6a2864de
b'ZSBh'
0x80122009
b'bmQg'
0x6823cb5a
b'Z2V0'
0xec5157cc
b'IHRo'
0x1a429051
b'ZSBm'
0xc997df0d
b'bGFn'
0x86bcd0ce
b'xD17'
0xe5d81889
b'AEAH'
0x4134031c
b'AA=='
[Finished in 316.6s]

可以看見纔多長這個東西很考驗pc的性能, 然後直接進行base64解碼, 得到的內容轉爲rar格式的文件, 然後補全文件頭得到flag, 這裏具體就不闡述了

得到的內容如下:

z5BzAAANAAAAAAAAAKo+egCAIwBJAAAAVAAAAAKGNKv+a2MdSR0zAwABAAAAQ01UCRUUy91BT5UkSNPoj5hFEVFBRvefHSBCfG0ruGnKnygsMyj8SBaZHxsYHY84LEZ24cXtZ01y3k1K1YJ0vpK9HwqUzb6u9z8igEr3dCCQLQAdAAAAHQAAAAJi0efVT2MdSR0wCAAgAAAAZmxhZy50eHQAsDRpZmZpeCB0aGUgZmlsZSBhbmQgZ2V0IHRoZSBmbGFnxD17AEAHAA==

個人網站

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章