本体解密取巧成分很大:
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",仍需要对其进行扩充。