感谢ctf show平台提供题目
下载到了题目的压缩包,放入010editor中,查看一下。
工具报错了,说明压缩包里面有东西。
看见尾部是 FFD9 就知道,压缩包里面有一张jpg图片。
ctrl + F 进行搜索jpg的文件头。FFD8
创建一个hex文件,并把FFD8 ~ FFD9之间的内容,复制出来,另存为jpg。
得到一张logo图片。
使用steghide 工具,密码为123456,解密图片得到提示信息。
(别问我为什么用这个工具,为什么是这个密码。我也是一顿尝试,不断猜测才解的。)
得到一串base64,进行解密得到了。
https://www.lanzous.com/i9dpjxe
下载后,是一大堆的数字,仔细观察里面的字母 并没有大于f的,那么就按常规思路,每俩个字符,16进制转文本。(原理:16进制→10进制→ascii码)
python脚本如下:
import re
def read_file(filepath):
with open(filepath) as fp:
content=fp.read();
return content
number = read_file('flag.txt')
result = []
result.append(re.findall(r'.{2}', number))
result = result[0]
print(result)
strings =''
for i in result:
y = bytearray.fromhex(i)
z = str(y)
z= re.findall("b'(.*?)'",z)[0]
strings += z
print(strings)
with open('test.txt', 'w') as f:
f.write(strings)
转换完之后,得到这样的文本。
看这个结构,我们就知道,是坐标 与 颜色值,那么用脚本把这个文本画出来。
从网上下载到的一个脚本。
通过阅读这个脚本,我们发现刚刚转换出来的文本,使用这个脚本并不能直接画出来,我们需要对刚刚的文本进行一下处理。
1、把坐标去掉
2、每个颜色值后加入换行符
处理文本脚本如下:
import re
def read_file(filepath):
with open(filepath) as fp:
content=fp.read();
return content
result = read_file('test.txt')
rgb = re.findall("\((.*?)\)",result)
#提出RGB
result = ''
for i in range(len(rgb)):
result = result + rgb[i] + '\n'
with open('rgb2.txt', 'w') as f:
f.write(result)
转换好了之后,这个文本就很规范了。
RGB画图脚本如下:
#-*- coding:utf-8 -*-
from PIL import Image
import re
x = 72 #x坐标 通过对txt里的行数进行整数分解
y = 74 #y坐标 x*y = 行数
im = Image.new("RGB",(x,y))#创建图片
file = open('rgb2.txt') #打开rbg值文件
#通过一个个rgb点生成图片
for i in range(0,x):
for j in range(0,y):
line = file.readline()#获取一行
# line = line.replace('\n','')
print(line)
rgb = line.split(",")#分离rgb
print(rgb)
im.putpixel((i,j),(int(rgb[0]),int(rgb[1]),int(rgb[2])))#rgb转化为像素
im.show()
im.save('1.png')
运行RGB画图脚本后得到了一张二维码。
二维码并不是很规范,打开ps工具。
新建一个大一点的画布。
矩形工具选中下部分,剪切 平移,得到完整二维码。
扫码得到flag,题目结束。
原创文章不易,点个赞再走吧。