2021第二届“天翼杯”网络安全攻防大赛 Misc rrrgggbbb
2021-09-23 20:34:00 # CTF

rrrgggbbb

下载附件attachments.zip,打开里面有三个图片

1632377804741.png

通过题目名rrrgggbbb可以推测在颜色通道藏有数据,用StegSolve分别打开这三张图片看看

rrr.png图片的red0通道读取一下,发现了一些数据

1632377965552.png

同理,ggg.png的g通道0的数据

1632378047570.png

bbb.png的b通道0的数据

1632378088220.png

我们将三个数据都Save Bin,保存下来,分别命名为r g b

1632378187804.png

仔细观察这些数据,发现 r 数据的首字节 是B, g数据的首字节是P, b数据的首字节是G,一下子就联想到了BPG格式的图片,接着我们查询一下BPG图片的文件头

1632378417893.png

在网上发现了 有关BPG图片格式的图片的 文件头是 BPGû0. r数据的第二个字节就是û,这下就印证了我们的思路是正确的,先读r数据的第一个字节B,然后再读g数据的第一个字节是P,然后再读 b数据的第一个字节G,然后再读r数据的第二个字节û,然后再读g数据的第二个字节0,然后再读b数据的第二个字节. 这就构成了文件头BPGû0.

其他数据以此类推,三个数据包,一个数据包依次读取一个字节。手撸的话,效率太慢了,我们写一个脚本,因为每个数据包后面都有大量垃圾数据,我们这里只需要每个包的前面部分的有效数据,因为每个包的有效数据末尾都是第202个字节,所以这里对字节数做出限制。用range(202)给seek指针指一个位置

1632380284674.png

脚本如下:

1
2
3
4
5
6
with open('flag.bpg', 'wb') as f1:
for idx in range(202):
for file in 'rgb':
with open(file, 'rb') as f:
f.seek(idx)
f1.write(f.read(1))

先创建一个名为flag.bpg空文件,然后将这些数据包跟脚本放在同一路径,运行一下脚本,数据就写进了flag.bpg

1632379182250.png

用010 Editor打开看看数据是否写进去了

1632379249943.png

确认没问题后,用bpgview可以直接打开bpg格式的图片

bpgview工具下载地址:https://bellard.org/bpg/

点击这个下载:

1632401072753.png

在当前路径,打开cmd窗口,使用命令打开bpg图片

命令:

1
bpgview.exe flag.bpg

1632379515393.png

运行之后,就会有一个弹窗,这个弹窗就是这个flag图片

所以flag为:

1
flag{1e0b38f7-d1ab-480e-bc82-3da0baae2451}