bugku~红绿灯

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

希望这篇对你有帮助哦!
一起进步!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

o3Ev

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值