[RGB][HDCTF2023]basketball

本体解密取巧成分很大:

Ida64打开程序后发现有两段加密:

1)、第一段,需要两个100以内的key和明文,加密后与str2比较,通过后进入后面的流程:

·

观察加密函数encode的加密流程:

发现是使用key进行某些处理后逐位异或,其中,gcd函数是求最大公因数额函数代码(辗转相除法):

可以写脚本,利用密文破解出明文。

2)、但是不急,先定位到flag的位置,观察其加密流程:

发现其加密流程仅为简单的异或,因此只需直到密文和key即可还原出flag。

注意:分析发现其中参与异或的str与第一段的加密并无联系,所以第一段加密完全可以置之不理,直接分析第二段加密流程。

分析:观察第二段加密流程发现,其选哟手动输入参与异或的str,然后将其扩充到28个字符。其中,str可以通过提米所给的array获得。

array如下:

看不懂,完全看不懂。

因此,直接跳过array,在根据题目flag的加密流程位异或,并且我们输入的key是全英文,因此,我们可以利用密文flag的特征外加异或还原出部分该由我们输入的key.

脚本和运行结果如下:

根据题目basketball,和灌篮高手的剧情与得到的部分key的特征,可以对key进行合理的推测:

key = "I want to play basketball"

根据推测的key,再对key进行扩充(题目加密要求key长度为28,不足则需要使用key前面的字符向后补充)

所以推测key="I want to play basketballI w"

解密脚本如下:

a=[0x01, 0x64, 0x34, 0x35, 0x28, 0x0F, 0x04, 0x45, 0x2E, 
0x6D, 0x2F, 0x28, 0x37, 0x37, 0x5C, 0x5E, 0x3E, 0x46,
0x17, 0x48, 0x08, 0x52, 0x1D, 0x41, 0x10, 0x75, 0x75, 0x0A]
key1=["HDCTF{","hdctf{","flag{"]
for i in key1:
    for j in range(len(i)):
        print(chr(ord(i[j])^a[j]),end="")
    print()
print(len("I want to play basketball"))
key="I want to play basketballI w"
for i in range(28):
    print(chr(ord(key[i])^a[i]),end="")

Flag=HDCTF{$1AM_DVN|<_5|-|0|-|<U}

顺利解出flag,提交通过,可以的推测正确。

后续查看官方的wp,发现array是一个图片,利用RGB三个数据一组可以将图片还原:

脚本如下:

from PIL import Image

# 从文件中读取数据
#路径为array文件在本地存储的路径
with open('d:\\array.txt', 'r') as f:
    data = f.read().split()  # 假设数据是空格分隔的

# 指定图像的宽度和高度
width = 637
height = 561

# 创建图像对象
image = Image.new("RGB", (width, height))

# 遍历数据并设置像素值
index = 0
for y in range(height):
    for x in range(width):
        r, g, b = int(data[index]), int(data[index + 1]), int(data[index + 2])
        image.putpixel((x, y), (r, g, b))
        index += 3

# 保存图像
image.save('output_image.png')

# 展示图像
image.show()

根据照片的提示也可推测出key为"I want to play basketball",仍需要对其进行扩充。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值