2020安恆杯元旦月賽-爆破鬼才-ZIP註釋信息+CRC32爆破+outguess隱寫爆破+生日字典

題目來源:2020安恆杯元旦月賽
題目名稱:爆破鬼才
題目考點:ZIP註釋信息+CRC32爆破+outguess隱寫爆破+生日字典

給出的是一個壓縮包,壓縮包中有註釋信息,註釋信息給出瞭解壓密碼的範圍:
在這裏插入圖片描述
使用ARCHPC爆破即可得到密碼:abc123
解壓之後裏面又是一個壓縮包,壓縮包裏面包含幾個文件:
在這裏插入圖片描述
使用010 Editor查看具體信息之後發現360壓縮給出的文件大小其實是不準確的,1.txt、2.txt、3.txt壓縮前的大小分別爲4 bytes、2 bytes、2 bytes,因此可以用CRC32碰撞破解這三個文件的內容,三個文件的內容組合起來便是壓縮包的解壓密碼:Blowitup(下面給出了CRC32碰撞破解2.txt、3.txt的腳本,破解1.txt的腳本類似,只是字節數不同)

# -*- coding:utf-8 -*-
import binascii

def crack():
    crcs = set([0xA28E7734, 0x4394EE70])

    r = xrange(32, 127)
    for a in r:
        for b in r:
            txt = chr(a)+chr(b)
            crc = binascii.crc32(txt)
            if (crc & 0xFFFFFFFF) in crcs:
                print txt

if __name__ == "__main__":
    crack()

除去作爲解壓密碼的文件,還有hint.txt和Ziggs.jpg兩個文件:
hint.txt文件的內容是:guess out my birthday
因此猜測是outguess隱寫,密碼需要通過生日字典爆破:

from os import system
from calendar import monthrange

year = 2012
month = 1
day = 1

key = ""

def inttostr(a, n):
    ret = str(a)
    while len(ret) < n:
        ret = '0' + ret
    return ret

def getNextKey():
    global key
    global year
    global month, day
    if key == '20200101':
        return 0
    day = day + 1
    if day > monthrange(year, month)[1]:
        day = 1
        month += 1
        if month > 12:
            month = 1
            year += 1
    key = str(year) + inttostr(month, 2) + inttostr(day, 2)
    return 1
    
def main():
    while getNextKey():
        cmd = "./outguess/outguess -k " + key + " -r Ziggs.jpg -t ./output/" + key +".txt"
        system(cmd)
    
if __name__ == "__main__":
    main()

因爲outguess無法判斷是否解密成功,但是我們知道flag文件大小應該是幾十個字節,因此可以先把所有的結果計算出來,然後按大小排序,最後人工篩選。
當key = '20140224’的時候得到flag:flag{8322e7eed667c69f27ecbea5f96d86ca}

發佈了8 篇原創文章 · 獲贊 26 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章