IDF实验室-特殊的日子

Posted by pzque on 2015-05-05     

一、原题

[原题链接]
每个人的一生中都会或多或少有那么几个对自己很重要的日子,比如对于我来说,这一天就很重要。

答案格式wctf{日期} //友情提示,此题需要暴力破解,但只是爆破这段密文,不是爆破这个网站。。 = =!

就是这一天↓

4D1FAE0B


二、writeup

没有思路,看提示,crc32
CRC(循环冗余校验法)的百科:[CRC]
以前看过,具体的细节忘了,对照资料回忆了一下,CRC是网络传输中经常用的一种校验方式。
其中CRC32则是采用这样的一个多项式生成式的CRC:

$X^{32}+X^{26}+X^{23}+X^{22}+X^{16}+X^{12}+X^{11}+X^{10}$
$+ X^8+X^7+X^5+X^4+X^2+X+1$

python中有现成的库计算crc32,参考[python计算CRC32]
参考以上链接给的函数:

1
2
3
4
5
6
7
import zlib
def crc32(st):
crc = zlib.crc32(st)
if crc > 0:
return "%x" % (crc)
else:
return "%x" % (~crc ^ 0xffffffff)

然后对所有的日期进行穷举,这里先限定日期的范围为'10000101'~'30001231',看能否找到结果。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 生成年'1000'~'3000'
year = [str(i) for i in range(1000,3000)]
# 生成月'01'~'12'
month = [str(i) if i>9 else (str(0)+str(i)) for i in range(1,13) ]

# 生成日'01'~'31'
day = [str(i) if i>9 else (str(0)+str(i)) for i in range(1,32) ]


# 题目所给
realDate = '4D1FAE0B'.lower()

# 穷举日期计算crc32值然后与题目给的值进行比对,一样则输出
import itertools
# 利用itertools.protduct()生成年月日的所有组合
for item in itertools.product(year,month,day):
date = ''.join(item)
if crc32(date) == realDate:
print date

得到结果

20190804

提交,无误。


三、flag

wctf{20190804}


四、总结