BugkuCTF—红绿灯(Misc)

题目链接:https://ctf.bugku.com/challenges#%E7%BA%A2%E7%BB%BF%E7%81%AF

BugkuCTF—红绿灯(Misc)_第1张图片

题目给出了一个gif

打开后发现是一个闪烁的红绿灯共1168帧

BugkuCTF—红绿灯(Misc)_第2张图片

一帧一帧查看发现多数是红色和绿色,偶尔有黄色且(每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

你可能感兴趣的:(CTF)