特殊的日子—IDF实验室CTF训练营

题目地址:http://ctf.idf.cn/index.php?g=game&m=article&a=index&id=50

Python3.5

 

特殊的日子

2015-01-06 18:09:25 作者:admin 255 2


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

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

就是这一天↓

4D1FAE0B


题目来源:难度:★☆分值:3已解答数:252FirstBlood:A

 

需要暴力破解,猜想可能是用了某种加密算法,答案是日期,应该是YYYYMMDD格式

在网上搜索之后发现是CRC32算法,

python3中有binascii和zlib中都包含crc32加密

注意(原文):

Note

To generate the same numeric value across all Python versions and platforms, use crc32(data) & 0xffffffff. If you are only using the checksum in packed binary format this is not necessary as the return value is the correct 32-bit binary representation regardless of sign.

要生成所有的Python版本和平台相同的数值,使用CRC32 (数据)& 0xffffffff 。
import zlib

def crc32(strs):
    crc=zlib.crc32(strs.encode('utf-8'))
    return '%x' % (crc & 0xffffffff)
result='4D1FAE0B'.lower()
for year in range(1000,3000):
    for month in range(1,13):
        for day in range(1,32):
            years=str(year)
            #month=(month<10)?('0'+str(month)):(str(month))
            months=str(month) if(month>=10) else ('0'+str(month))
            #day=day<10?('0'+str(day)):(str(day))
            days=str(day) if(day>=10) else ('0'+str(day))
            strs=years+months+days
            if(crc32(strs)==result):
                print(strs)
                exit()

总结:

     python3中没有三目运算符,可用 为真时的结果 if 判定条件 else 为假时的结果  代替

     zlib.crc32()参数为bytes对象,不能用str,故需要用str.encode('utf-8') 转化为bytes

 

三重循环消耗时间,内存都很多,在网上发现大神写法:(使用了itertools.product函数)

import zlib
def crc32(st):
    crc = zlib.crc32(st.encode('utf-8'))
    if crc > 0:
      return "%x" % (crc & 0xffffffff)
    else:
      return "%x" % (crc & 0xffffffff)

#生成年'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.product()生成年月日的所有组合
for item in itertools.product(year,month,day):
    date = ''.join(item)
    if crc32(date) == realDate:
        print(date)

转载于:https://www.cnblogs.com/DreamZero/p/5116125.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值