来到主函数,很清晰的逻辑,分三步
第一步:爆破,求出一个hint
第二步:根据hint,求出str数组
第三步:最后求出flag
先将hint求出来,给了Str2数组
先看看f函数
再跟进text_66函数,发现是辗转相除法
写脚本进行爆破
str = [85, 105, 104, 120, 33, 104, 114, 33, 96, 33, 105, 98, 101, 117, 33, 124, 105, 106, 117, 33, 72, 33, 105, 100,
109, 113, 43, 120, 110, 116, 33, 104, 114, 43, 115, 100, 108, 104, 111, 101, 33, 120, 110, 116, 33, 117, 110, 33,
98, 73, 100, 98, 106, 33, 117, 105, 100, 33, 96, 115, 115, 96, 120, 33, 96, 111, 101, 33, 117, 105, 115, 100,
100, 33, 111, 116, 102, 99, 100, 115, 114, 33, 98, 96, 111, 33, 119, 98, 100, 118, 33, 96, 114, 33, 96, 33, 102,
115, 110, 116, 113]
def text_66(a, b):
aa = a
ba = b
if a < b:
aa, ba = ba, aa
if ba:
return text_66(ba, aa % ba)
else:
return aa
def f(k1_0, k2_0):
for i in range(len(str)):
k1_0 = (str[i] + k1_0) % 300
k2_0 = (str[i] + k2_0) % 300
str[i] ^= text_66(k1_0, k2_0)
for x in range(100):
for y in range(100):
str = [85, 105, 104, 120, 33, 104, 114, 33, 96, 33, 105, 98, 101, 117, 33, 124, 105, 106, 117, 33, 72, 33, 105,
100, 109, 113, 43, 120, 110, 116, 33, 104, 114, 43, 115, 100, 108, 104, 111, 101, 33, 120, 110, 116, 33,
117, 110, 33, 98, 73, 100, 98, 106, 33, 117, 105, 100, 33, 96, 115, 115, 96, 120, 33, 96, 111, 101, 33,
117, 105, 115, 100, 100, 33, 111, 116, 102, 99, 100, 115, 114, 33, 98, 96, 111, 33, 119, 98, 100, 118,
33, 96, 114, 33, 96, 33, 102, 115, 110, 116, 113]
f(x, y)
for i in str:
if i < 33 or i > 127:
break
else:
print(''.join(chr(j) for j in str))
得到提示:(三个nugber可以作为一组进行查看)
I help*you is*remind you to cHeck the array and three nugbers can vcew as a group
根据hint想到RGB
写出脚本咯
from PIL import Image
with open('C:\\Users\\86158\\Desktop\\RE-NO_1\\basketball\\array.txt', 'r') as f:
data = f.readlines() # txt中所有字符串读入data
for line in data:
list = line.split(' ') # 将单个数据分隔开存好
# print(data)#相当于将txt里的字符串存在一个data数组中
# print(list)#将每一个数据单个隔开,变成单个字符或者数
# print(len(list))#长度验证 1072071
# print(637 * 561 * 3)# 1072071
# 提示中也有
f.close()
x = 637 # x坐标 通过对txt里的行数进行整数分解 宽度
y = 561 # y坐标 x * y = 行数 高度
im = Image.new("RGB", (x, y)) # 创建图片
index = 0
# 在Python中,PIL(Python Imaging Library)模块提供了putpixel方法,用于在图像中设置指定位置的像素颜色
for j in range(0, y): # 通过每个rgb点生成图片
for i in range(0, x):
im.putpixel((i, j), (int(list[index]), int(list[index + 1]), int(list[index + 2]))) # 将rgb转化为像素
index += 3
im.show() # 展现图片
得到一张图片:
根据文中提示
将它转为英文,长度为28:I want to play basketballI w
所以最后的脚本为:
str = 'I want to play basketballI w'
code = [1,
100,
52,
53,
40,
15,
4,
69,
46,
109,
47,
40,
55,
55,
92,
94,
62,
70,
23,
72,
8,
82,
29,
65,
16,
117,
117,
10, ]
for i in range(28):
print(chr(ord(str[i]) ^ code[i]), end='')
HDCTF{$1AM_DVN|<_5|-|0|-|<U}