【攻防世界】-双色块

⭕、知识点
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模块对文件名的升序排列

posted @ 2025-04-12 22:04  wyuu101  阅读(134)  评论(0)    收藏  举报