【攻防世界】-双色块
⭕、知识点
GIF拆帧/二进制编码/DES解密
一、题目
给了一张GIF图片

二、解题
1、观察gif发现仅有粉、绿色块,初步推断可能分别代表二进制0和1,或者是需要把图片合并起来
2、再用binwalk扫一下发现隐藏png图片,foremost提取得到一个key

3、gif拆帧,网址:https://uutool.cn/gif2img/
发现是24个色块刚好一行

4、先尝试合并图片
写如下脚本
from PIL import Image
import numpy as np
import os
from natsort import natsorted
dir_path = "gif_frames"
file_names = natsorted(os.listdir(dir_path))
new_img_array = np.zeros((240, 240, 4), np.uint8)
for file_name in file_names:
image = Image.open(dir_path + "/" + file_name)
image_array = np.array(image)
new_img_array += image_array
new_img = Image.fromarray(new_img_array)
new_img.show()
运行得到合并后的图片

并无什么特别的信息,但是可以看出来每八个一组时,首个色块都是绿色,如果八个色块表示一个ASCII码,则绿色色块应该表示0
5、编写脚本把每一帧图片转为二进制,并转义为ASCII文本看看
from PIL import Image
import numpy as np
import os
from natsort import natsorted
import textwrap
dir_path = "gif_frames"
file_names = natsorted(os.listdir(dir_path))
result = ""
row = 0
column = 0
for file_name in file_names:
image = Image.open(dir_path + "/" + file_name)
image_array = np.array(image)[..., 0:3]
if image_array[row*10, column*10, ][1] == 255:
result += "0"
else:
result += "1"
column += 1
if column % 24 == 0:
row += 1
column = 0
words_bit = textwrap.wrap(result, 8)
result = ""
for word in words_bit:
result += chr(int(word, 2))
print(result)
运行得到

6、base64解码得到乱码
7、结合之前的key,考虑可能是des解密,网址hat.openai.com
解密得到flag

三、答案
flag{2ce3b416457d4380dc9a6149858f71db}
四、总结
这道题虽然原理简单,思路容易想到,但是实操起来却不容易,难在脚本编辑
为此进行了专门的学习,在脚本编写的过程中有如下收获
1、PIL库的掌握
2、numpy切片操作的熟练运用
3、natsort模块对文件名的升序排列

浙公网安备 33010602011771号