[HDCTF2023]basketball-复现

43 篇文章 1 订阅
20 篇文章 0 订阅

来到主函数,很清晰的逻辑,分三步

第一步:爆破,求出一个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}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值