春秋杯Misc pixel_master

这是一个春秋杯差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}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值