題目來源: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}