BaseCTF Week3 Web & Misc 解题报告
杂项
[Week3] 白丝上的 flag
描述: 某出题人赠送大家 flag 时遭遇了信号干扰,幸好我们在不知名小网站找到了写入 flag 前的图片,尝试还原信息吧!
提示: flag 是单色
附件:
#task.py from PIL import Image from random import randint import sys def ez_add(a,b,c,d): global iv h = (a+b+c+d+iv) % 256 e = b f = c g = d iv = (b+c+d+iv) % 256 return e,f,g,h def confuse(data): r,g,b,a = data for _ in range(8): r,g,b,a = ez_add(r,g,b,a) return r,g,b,a def confuse_image(flag): global iv iv = flag.getpixel((1,1))[0] img = Image.new('RGBA', (flag.width, flag.height)) for w in range(img.width): for h in range(img.height): img.putpixel((w, h), confuse(flag.getpixel((w,h)))) return img if __name__ == '__main__': iv = 0 flag = Image.open("./de_image.png") img = confuse_image(flag) img.save("en_image.png")
解密思路:
- 逆向
confuse函数: 由于confuse函数是对像素进行简单的加法运算,我们可以通过逆向运算来解密。 - 单色图像特点: 单色图像的每个像素的 RGB 值都相同,我们可以利用这个特点来简化解密过程。
脚本:
from PIL import Image def ez_sub(h, e, f, g): global iv a = (h - e - f - g - iv) % 256 iv = (e + f + g + iv) % 256 return a def unconfuse(data): r, g, b, a = data for _ in range(8): r = ez_sub(r, g, b, a) return r, g, b, a def (): iv iv = img.getpixel((, ))[] flag = Image.new(, (img.width, img.height)) w (img.width): h (img.height): flag.putpixel((w, h), unconfuse(img.getpixel((w, h)))) flag __name__ == : iv = img = Image.() flag = unconfuse_image(img) flag.save()


