bugku~红绿灯
下载好附件打开:
是一张gif图片
仔细观察,在闪一定数量后,黄灯开始闪烁,猜测红绿应该是一种加密,不是01就是摩斯,再数一下数,可以发现在红绿交替闪烁8次过后黄灯闪烁
毫无疑问,这是二进制信号
第一个问题来了,怎么将图片信号灯转换为二进制形式呢?
这就要通过python里的PIL库来实现了(PIL~~yyds!)
PIL库是python里自带的库,用的最多的就是里面的Image方法了
给大家讲讲最简单的Image知识,待会不至于看不懂代码:
Image.open('xxx.jpg')
:它将会打开一张图片
Image.tell()
:这是找到GIF的帧数
Image.seek()
:这个代码是取当前帧数的照片
getpixel()
:是取当前像素点的颜色
save()
:保存当前图片
show()
:展示当前图片
format()
:是照片的格式
大概就差不多了,随后我们读取每一帧照片,将其保存到建的文件夹里
这是脚本:
from PIL import Image
im=Image.open('C:\AppData\\2.gif')
savepath=('C:\AppData\shi\\')
try:
im.save(savepath+'yy{:d}.png'.format(im.tell()))
while True:
im.seek(im.tell()+1)
im.save(savepath+'yy{:d}.png'.format(im.tell()))
im.show()
except:
pass
当运行后,发现能得到照片,那这一步就是对的,(由于im.show()是在while循环里,会一直弹图片)只需要停止运行就可以了
接下来进入下一步:要将得到的每一张图片转换成二进制,这就得先找到红绿对应的点,然后通过点的信息来将其转换成二进制
这里直接先铺垫一步,不然也看不懂代码,红色大概对应的坐标为(110,40),绿色对应的为(105,140),一共有1168张照片,前两张没用
接下来可以上代码了,先可以通过getpixel()来找到对应点的颜色:
from PIL import Image
im=Image.open('C:\AppData\\2.gif')
savepath=('C:\AppData\shi\\')
try:
im.save(savepath+'yy{:d}.png'.format(im.tell()))
while True:
im.seek(im.tell()+1)
im.save(savepath+'yy{:d}.png'.format(im.tell()))
except:
pass
d=''
image=Image.open(savepath+'yy'+str(2)+'.png')
print image.getpixel((110,40))
注意这里我把im.show()去掉了,不然会运行不完,得到红色为251,绿色也同理,为186
这时给出脚本:
from PIL import Image
im=Image.open('C:\AppData\\2.gif')
savepath=('C:\AppData\shi\\')
try:
im.save(savepath+'yy{:d}.png'.format(im.tell()))
while True:
im.seek(im.tell()+1)
im.save(savepath+'yy{:d}.png'.format(im.tell()))
except:
pass
d=''
for i in range(1168):
image=Image.open(savepath+'yy'+str(i)+'.png')
if image.getpixel((110,40))==251:
d+=str(1)
elif image.getpixel((105,140))==186:
d+=str(0)
print d
运行过后可以看到出现了二进制数字
接下来得脚本想法就是将二进制文件转为字符串了
这里直接在后面加上这串代码就ok了:
flag=hex(int(d,2))[2:-1]
print flag.decode("hex")
运行一下就可以得到flag,这里的[2:-1]意思就是从第三张图片开始到最后一张图片
这里还有另外一种解二进制的,但还要在开头加上import re
flag=''
e=re.findall(r'.{8}',d)
for j in e:
g=chr(int(j,2))
flag+=g
print flag
运行也可以得到flag
希望这篇对你有帮助哦!
一起进步!