75: Whitzard OJ逆向-Encrypt-abc

在这里插入图片描述
这里a1大于1,所以需要给参数。
在这里插入图片描述这段代码,主要是把参数分为三段。
第一段就是前4位,
第二段是4到9位,
第三段是9到12位。
然后两个strtol说明第一段和第二段是16进制的数字,也就是0-F。
在这里插入图片描述函数是sha1加密,用findcrypt插件查出来的,动态调了一下,确定就是sha1了。
在这里插入图片描述最终需要满足4个条件才能获取flag。
第二段的sha1加密等于69fc8b9b1cdfe47e6b51a6804fc1dbddba1ea1d9
第一段和第二段的sha1加密的前四位和他们本身相等。
第一段要小于第二段。(以数值相比)

用代码表示如下:

x = 1到4
y = 4到9
z = 9到12

a1 = sha1(x)
a2 = sha1(y)
a3 = sha1(z)

a2 = 69fc8b9b1cdfe47e6b51a6804fc1dbddba1ea1d9
x < z
x = a1[0:4]
z = a3[0:4]

给出脚本:

import hashlib
import string
import itertools

str_t = itertools.product(string.printable, repeat=4)
print(str_t)

for i in range(0xffff):
    i_hex = "%04x" % i
    sha1 = hashlib.sha1()
    sha1.update(i_hex.encode(encoding='utf-8'))
    tmp = sha1.hexdigest()
    if i_hex == tmp[0:4]:
        print(i_hex, tmp)
#输出两个值,inp1是小的那个,inp3是大的那个
inp1 = 0x57d9
inp3 = 0xb53a

j = 0
for i in str_t:
    j += 1
    i_hex = '9' + ''.join(i) + 'b'
    sha1 = hashlib.sha1()
    sha1.update(i_hex.encode(encoding='utf-8'))
    tmp = sha1.hexdigest()
    print(j)
    if '69fc8b9b1cdfe47e6b51a6804fc1dbddba1ea1d9' == tmp:
        print(i_hex, tmp)
        break
#跑出inp2,得到最终答案,输入,获取flag
inp2 = '9:-*)b'
print(hex(inp1)[2:] + inp2[1:] + hex(inp3)[3:])

itertools.product(string.printable, repeat=4)
产生笛卡尔积的。

import itertools

str1 = '1234'
str_t = itertools.product(str1, repeat=2)
for i in str_t:
    print(''.join(i))

result:
11
12
13
14
21
22
23
24
31
32
33
34
41
42
43
44
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值