攻防世界-glance-50-WriteUp附Python解题脚本

系统 3119 0

题目分析

拿到题目以后题目是一个长条状gif

攻防世界-glance-50-WriteUp附Python解题脚本_第1张图片
那么这个题大概率就是分离gif的每一帧然后拼接形成图片得到flag

解题步骤

有了思路以后,步骤也很清晰。就是两步。第一步,分离gif,第二步,拼接gif

  • 步骤

1.分离gif
好多方法都可以分离gif,这里使用python分离一下,上代码:

            
              
                #分离gif.py
              
              
                from
              
               PIL 
              
                import
              
               Image

savepath 
              
                =
              
              
                "F:\ctf文件\\D-R0s1\\"
              
              
                #保存路径
              
              

im 
              
                =
              
               Image
              
                .
              
              
                open
              
              
                (
              
              
                'F:\ctf文件\\1.gif'
              
              
                )
              
              
                #从文件加载图像
              
              
                try
              
              
                :
              
              
    im
              
                .
              
              save
              
                (
              
              savepath
              
                +
              
              
                '{:d}.png'
              
              
                .
              
              
                format
              
              
                (
              
              im
              
                .
              
              tell
              
                (
              
              
                )
              
              
                )
              
              
                )
              
              
                #读取每一帧
              
              
                while
              
              
                True
              
              
                :
              
              
        im
              
                .
              
              seek
              
                (
              
              im
              
                .
              
              tell
              
                (
              
              
                )
              
              
                +
              
              
                1
              
              
                )
              
              
                #在不同帧之间移动
              
              
        im
              
                .
              
              save
              
                (
              
              savepath
              
                +
              
              
                '{:d}.png'
              
              
                .
              
              
                format
              
              
                (
              
              im
              
                .
              
              tell
              
                (
              
              
                )
              
              
                )
              
              
                )
              
              
                #保存文件
              
              
                except
              
              
                :
              
              
                pass
              
            
          

分离出来发现有两百多个图像
攻防世界-glance-50-WriteUp附Python解题脚本_第2张图片 2.使用python将这两百多个图像拼接起来,上代码:

            
              
                #拼接图像.py
              
              
                from
              
               PIL 
              
                import
              
               Image
path 
              
                =
              
              
                "F:\\ctf文件\\D-R0s1\\"
              
              
save_path 
              
                =
              
              
                'F:\\ctf文件\\'
              
              

im 
              
                =
              
               Image
              
                .
              
              new
              
                (
              
              
                'RGBA'
              
              
                ,
              
              
                (
              
              
                2
              
              
                *
              
              
                201
              
              
                ,
              
              
                600
              
              
                )
              
              
                )
              
              
                #创建新照片
              
              

    imagefile 
              
                =
              
              
                [
              
              
                ]
              
              
                #存储所有的图像的名称
              
              
    width 
              
                =
              
              
                0
              
              
                for
              
               i 
              
                in
              
              
                range
              
              
                (
              
              
                0
              
              
                ,
              
              
                201
              
              
                )
              
              
                :
              
              
        imagefile
              
                .
              
              append
              
                (
              
              Image
              
                .
              
              
                open
              
              
                (
              
              path
              
                +
              
              
                str
              
              
                (
              
              i
              
                )
              
              
                +
              
              
                '.png'
              
              
                )
              
              
                )
              
              
                #遍历,将图像名称存入imagfile
              
              
                for
              
               image 
              
                in
              
               imagefile
              
                :
              
              
    im
              
                .
              
              paste
              
                (
              
              image
              
                ,
              
              
                (
              
              width
              
                ,
              
              
                0
              
              
                ,
              
              
                2
              
              
                +
              
              width
              
                ,
              
              
                600
              
              
                )
              
              
                )
              
              
                #将图片张贴到另一张图片上
              
              
    width 
              
                =
              
               width 
              
                +
              
              
                2
              
              
im
              
                .
              
              save
              
                (
              
              save_path
              
                +
              
              
                'D-R0s1.png'
              
              
                )
              
              
im
              
                .
              
              show
              
                (
              
              
                )
              
            
          

拼接后结果
攻防世界-glance-50-WriteUp附Python解题脚本_第3张图片
得到flag

题目解题脚本分析

拼接图像.py

  • 第一部分
            
              im 
              
                =
              
               Image
              
                .
              
              new
              
                (
              
              
                'RGBA'
              
              
                ,
              
              
                (
              
              
                2
              
              
                *
              
              
                201
              
              
                ,
              
              
                600
              
              
                )
              
              
                )
              
              
                #创建新照片
              
            
          

根据图像原来的宽度高度创建一个新图像
攻防世界-glance-50-WriteUp附Python解题脚本_第4张图片

  • 第二部分
            
              imagefile 
              
                =
              
              
                [
              
              
                ]
              
              
                #存储所有的图像的名称
              
              
width 
              
                =
              
              
                0
              
              
                for
              
               i 
              
                in
              
              
                range
              
              
                (
              
              
                0
              
              
                ,
              
              
                201
              
              
                )
              
              
                :
              
              
    imagefile
              
                .
              
              append
              
                (
              
              Image
              
                .
              
              
                open
              
              
                (
              
              path
              
                +
              
              
                str
              
              
                (
              
              i
              
                )
              
              
                +
              
              
                '.png'
              
              
                )
              
              
                )
              
              
                #遍历,将图像名称存入imagfile
              
            
          

在文件目录下遍历图像并将图像名称存入inagefile中

  • 第三部分
            
              
                for
              
               image 
              
                in
              
               imagefile
              
                :
              
              
    im
              
                .
              
              paste
              
                (
              
              image
              
                ,
              
              
                (
              
              width
              
                ,
              
              
                0
              
              
                ,
              
              
                2
              
              
                +
              
              width
              
                ,
              
              
                600
              
              
                )
              
              
                )
              
              
                #将图片张贴到另一张图片上
              
              
    width 
              
                =
              
               width 
              
                +
              
              
                2
              
            
          

此处需要特别重要的是im.paste()中的值,(width,0,2+width,600)这是图像的一组坐标值。相当于(x1,y1,x2,y2),对应坐标图为:
攻防世界-glance-50-WriteUp附Python解题脚本_第5张图片 这样一来这个坐标值就很容易理解了(width,0,2+width,600)
宽度就是2每次加2这样叠加起来,高度就是0-600。图片原始属性的高度。
这样就实现了循环粘贴的目的。

总结

切实提高自己的编码能力,让程序代替搬砖。
关于python脚本处理图片隐写可以参考一下yanzm师傅在i春秋的文章。


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论