这里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