题目链接:https://ctf.bugku.com/challenges#%E7%BA%A2%E7%BB%BF%E7%81%AF
题目给出了一个gif
打开后发现是一个闪烁的红绿灯共1168帧
一帧一帧查看发现多数是红色和绿色,偶尔有黄色且(每8个红绿后跟一个黄)
可以推测红色和绿色对应二进制0和1,黄色作为分隔
这样第一个黄灯之前数值为01100110或10011001
而01100110二进制转成ascii对应字符就是‘f’,依次可以验证前四个字符为flag
就可以确定绿灯对应0,红灯对应1
一种笨方法就是手动记录红绿(也能做出来)
还有就是跑python脚本,脚本如下
先新建一个文件夹gif(需要先创建)把所有帧都保存下来
可以查看图片属性,位深度为8,颜色值为0-255
用画图定位到红绿灯所在坐标(是一个区域,随便取一个判断颜色值来确定该帧是红灯还是绿灯),红灯为(115,55),绿灯为(115,145)
输出该坐标下的颜色值发现为红灯是颜色值是251,为绿灯时颜色值是186
python脚本如下:
# -*- coding: cp936 -*-
from PIL import Image
savepath='D:\\gif\\'
im=Image.open('D:\\Traffic_Light.gif')
try:
#tell是帧数,而seek是取当前帧数的图片。
im.save(savepath+'light{0}.png'.format(im.tell()))
while True:
im.seek(im.tell()+1)
im.save(savepath+'light{0}.png'.format(im.tell()))
except:
pass
flag=""
for i in range(1168):
image=Image.open(savepath+'light'+str(i)+'.png')
#print image.getpixel((115,55))#输出颜色值
#print image.getpixel((115,145))
if image.getpixel((115,55))==251:
flag+=str(1)
elif image.getpixel((115,145))==186:
flag+=str(0)
flag= hex(int(flag,2))[2:-1].decode('hex')#二进制转字符串
print flag
跑脚本得到flag
关于CTF 图像隐写Python脚本处理 ,python PIL图像处理库一片非常好的文章:
https://mp.weixin.qq.com/s?__biz=MzU1ODg3NTMyMQ==&mid=2247489685&idx=1&sn=7e425ab7f0b37592e277998aed410456&chksm=fc1e8f43cb6906558b6a02df7bd8b635935e558210c453852f82083ac3fa15699bea794a94ee&mpshare=1&scene=23&srcid=0719qIyxYw61ORhW2ra6jZsu#rd