题目分析
拿到题目以后题目是一个长条状gif
那么这个题大概率就是分离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
分离出来发现有两百多个图像
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
(
)
题目解题脚本分析
拼接图像.py
- 第一部分
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
在文件目录下遍历图像并将图像名称存入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),对应坐标图为:
这样一来这个坐标值就很容易理解了(width,0,2+width,600)
宽度就是2每次加2这样叠加起来,高度就是0-600。图片原始属性的高度。
这样就实现了循环粘贴的目的。
总结
切实提高自己的编码能力,让程序代替搬砖。
关于python脚本处理图片隐写可以参考一下yanzm师傅在i春秋的文章。