这是一个春秋杯差0.03秒没交上的flag
pixel_master
黑 1 白 0 读取二进制,转换十六进制就是下一张 PNG 图片的十六进制,这步就不用多说了
有第一张图为例,还是比较好联想的(指对了两个小时脑洞)
。第一行按顺序出现黑、红、绿、蓝四种颜色,其余部分为白色 。 全图共出现五种颜色(黑、红、绿、蓝、白)
。 白色仅出现在第一行和最后一行
假设第一行是告诉我们颜色到数字的映射关系:黑对应 0、红对应 1、绿对应 2、蓝对应 3 、忽略白色,读取整张图片按四进制转换。写个脚本验证猜想。
from PIL import Image import numpy as np
# GPT一键注释(
# 打开图片并将其转换为RGB模式
image = Image .open( " download .png " ) .convert( " RGB " )
pixels = np .array(image) # 将图片转换为NumPy数组以便处理
# 定义颜色到数字的映射(忽略白色) color_map = {
(0 , 0 , 0) : 0 , # 黑色 -> 0
(255 , 0 , 0) : 1 , # 红色 -> 1
(0 , 255 , 0) : 2 , # 绿色 -> 2
(0 , 0 , 255) : 3 , # 蓝色 -> 3
}
# 将图片转换为数字矩阵 result = []
for i in range(pixels .shape[0]): # 遍历每一行
row = []
for j in range(pixels .shape[1]): # 遍历每一列
r , g , b = pixels[i , j] # 获取当前像素的RGB值
if (r , g , b) in color_map: # 如果颜色在映射表中
row .append(str(color_map[(r , g , b)])) # 将对应的数字添加到当前行 result .append( " " .join(row)) # 将当前行的数字拼接成一个字符串并添加到结果中
# 将整个图片的数字拼接成一个数字,并忽略前4个字符(第一行示例的0123) big_number = " " .join(result)[4:]
# 将大数字从4进制转换为16进制
hex_number = hex(int(big_number , 4))
# 将16进制数据写入文件
with open( " output .png " , " wb " ) as f :
f .write(bytes .fromhex(hex_number[2:])) # 去掉16进制前缀"0x"并写入文件
然后我们就得到了这个缺了一个角的汉信码
剩下就是 PS 了
flag{08f87707-f4c6-46cd-aaf6-8fbdd655d5cd}