CTFmisc图像题(zsteg取zip、压缩包重组、IDAT数据隐写、Markdown编写LaTeX、零宽字节隐写)

一、题目描述

BMZCTF第二届网络安全公开赛,主办单位:白帽子社区 · WHT战队,2022年1月1日,白帽杯
misc
题目名称:游戏秘籍
题目说明:做为程序员我的,竟然无法调出30条命,我用笔记记录下来了。

游戏秘籍hint:压缩包注意标识,再重组。
游戏秘籍hint2:笔记是用mardown记录的。

下载一张名为30.png的魂斗罗图片:
在这里插入图片描述

二、题目分析与完成

zsteg取zip

zsteg 30.png查看一下(也可以zsteg -a 30.png):
在这里插入图片描述
发现有PK开头的字符,可能是压缩包,隐藏的数据位置处于 extradata:0
提取压缩包:

zsteg -E "extradata:0" 30.png > 30.zip

压缩包重组

010editor打开,发现一段提示:Need_Find_The_Passwd_to_unzip_file0
在这里插入图片描述
删除504B0102前的数据后,双击打开发现压缩包损坏。

正常压缩包开头是50 4B 03 04,还包括50 4B 01 02和50 4B 05 06等字段。

一个 ZIP 文件由三个部分组成:
压缩源文件数据区+压缩源文件目录区+压缩源文件目录结束标志
CTF压缩包隐写类(zip、RAR)

50 4B 01 02:目录中文件文件头标记
3F 00:压缩使用的 pkware 版本  
14 00:解压文件所需 pkware 版本  
00 00:全局方式位标记(有无加密,这里的 01 00为真加密)  
08 00:压缩方式  

将此压缩包重组,搜索05 06、03 04 字段,发现均缺少50 4B,插入这两比特字节,然后用WinRAR自带的修复重组顺序。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
压缩包可以正常打开,但需要密码。
在这里插入图片描述

IDAT数据隐写

用010editor打开,发现很多类似这样的错误:

*ERROR: CRC Mismatch @ chunk[17]; in data: 5468655f; expected: 4a57f189
*错误:CRC不匹配@ chunk[17]; 在数据:5468655f; 预计:4a57f189  

在这里插入图片描述
将in data:后的数据拷贝出来,按照顺序生成十六进制文件,
5468655f68696e745f69733a55316b6b67473a56624445335b316f795b3145656044457960306768537a463e3e3e3ee4b88ae99da2e5ad97e7aca6e4b8b2e5bc82e68896e99bb6e58f89e99bb6e4b889e784b6e5908ee59ca8424153453634e8a7a3e7a081e38082596f755f

即新建16进制文本文档,然后在文本选项里选择导入16进制文件,最后在右下角改成UTF8编码。
在这里插入图片描述
得到hint:

The_hint_is:U1kkgG:VbDE3[1oy[1EeDEy0ghSzF>>>>上面字符串异或零叉零三然后在BASE64解码。You_

写python脚本获得密码:What?That_is_a_passwd?!

import base64

str1 = "U1kkgG:VbDE3[1oy[1Ee`DEy`0ghSzF>>>>"
flag_base64 = ""
for i in range(len(str1)):
    a = ord(str1[i]) ^ 0x03
    flag_base64 += chr(a)
print(flag_base64)
flag = base64.b64decode(flag_base64)
print(flag)
# What?That_is_a_passwd?!

解压压缩包得到Flag.txt。

Markdown编写LaTeX

打开txt文档发现是一串下面这样的编码(这里用记事本打开,实际上不是这样排列的):

# 游戏笔记 \begin{array}{c}\begin{array}{c}\begin{array}{c|ccccc}\\\uparrow\uparrow&0&1&2&3&4\\\hline0&1&1&1&1&1\\1&1&0&0&0&0\\2&1&0&1&1&1\\3&1&0&1&1&1\\4&1&0&1&1&1\\\end{array}&\begin{array}{c|ccccc}\\\downarrow\downarrow&0&1&2&3‌‌‌‌‌‬‍‬‌‌‌‌‌‍‌\\\hline0&1&1&0&0‌‌‌‌‌‬‍‬‌‌‌‌‌‌‍\\1&0&1&0&0‌‌‌‌‌‬‍‬‌‌‌‌‌‌‌\\2&0&1&0&1‌‌‌‌‌‬‍‬‌‌‌‌‌‌‍\\3&0&1&0&0‌‌‌‌‌‬‍‬‌‌‌‌‌‌‍\\4&0&1&0&0‌‌‌‌‌‬‍‬‌‌‌‌‌‌‌‌‍\\\end{array}&\begin{array}{c|ccccc}\\\rightarrow\rightarrow&0&1&2&3&4\\\hline0&1&1&0&1&1\\1&0&1&0&1&0\\2&0&1&0&1&0\\3&1&1&0&1&0\\4&0&0&0&1&0\\\end{array}&\begin{array}{c|ccccc}\\\leftarrow\leftarrow&0&1&2&3‌‌‌‌‌‬‍‬‌‌‌‌‌‍‌\\\hline0&0&0&1&0‌‌‌‌‌‬‍‬‌‌‌‌‌‌‍\\1&1&1&1&1‌‌‌‌‌‬‍‬‌‌‌‌‌‌‌\\2&1&0&1&1‌‌‌‌‌‬‍‬‌‌‌‌‌‌‌\\3&1&1&0&1‌‌‌‌‌‬‍‬‌‌‌‌‌‌‌\\4&1&0&0&0‌‌‌‌‌‬‍‬‌‌‌‌‌‌‌\\\end{array}&\begin{array}{c|cc}\text{ABAB}&1&2&3&4&5\\\hline0&1&1&1&1&1\\1&0&0&0&0&1\\2&1&1&1&0&1\\3&1&1&1&0&1\\4&1&1&1&0&1\\\end{array}\end{array}\\\begin{array}{c}\begin{array}{c|ccccc}\\\uparrow\uparrow&0&1&2&3&4\\\hline0&1&0&0&0&0\\1&1&1&1&1&1\\2&0&0&0&0&0\\3&1&1&1&0&1\\‌‌‌‌‌‍‌‌‌‌‌‌‬‍‬‌‌‌‌‌‌‌‌‌‌‌‌‬‍‬‌‌‌‌‌‌‌‌‌‌‌‌‬‍‬‌‌‌‌‌‌‌‌‌‌‌‌‬‍‬‌‌‌‌‌‌‍‌‌‌‌‌‬‍‬‌‌‌‌‌‌‌‌‌‌‌‍‍‌‌‌‌‌‍‍‌\end{array}&\begin{array}{c|cc}\\\leftarrow\leftarrow&0&1&2&3‌‌‌‌‌‬‍‬‌‌‌‌‌‍‌\\\hline0&0&0&0&1‌‌‌‌‌‬‍‬‌‌‌‌‌‌‍\\1&1&0&1&0‌‌‌‌‌‬‍‬‌‌‌‌‌‌‍\\2&1&0&1&1‌‌‌‌‌‬‍‬‌‌‌‌‌‌‍\\3&1&1&0&1‌‌‌‌‌‬‍‬‌‌‌‌‌‌‌\\‌‌‌‌‌‍‌‌‌‌‌‌‬‍‬‌‌‌‌‌‌‍‌‌‌‌‌‬‍‬‌‌‌‌‌‌‌‌‌‌‌‌‬‍‬‌‌‌‌‌‌‌‌‌‌‌‌‬‍‬‌‌‌‌‌‌‌‌‌‌‌‌‬‍‬‌‌‌‌‌‌‍‌‬‌‌‌‌‌‌‬‌‌‌‌‍‌‌‌‌‍‍‌‌‌‌‌‍‍‌\end{array}&\begin{array}{c|cc}\\\rightarrow\rightarrow&0&1&2&3&4\\\hline0&0&1&0&1&0\\1&0&1&0&1&1\\2&1&1&0&0&0\\3&1&0&1&1&0\\‌‌‌‌‌‍‌‌‌‌‌‌‬‍‬‌‌‌‌‌‌‌‌‌‌‌‌‬‍‬‌‌‌‌‌‌‍‌‌‌‌‌‬‍‬‌‌‌‌‌‌‌‌‌‌‌‌‬‍‬‌‌‌‌‌‌‌‌‌‌‌‌‬‍‬‌‌‌‌‌‌‌‌‌‌‌‍‍‌‌‌‌‌‍‍‌\end{array}&\begin{array}{c|cc}\\\downarrow\downarrow&0&1&2&3‌‌‌‌‌‬‍‬‌‌‌‌‌‍‌\\\hline0&0&1&0&0‌‌‌‌‌‬‍‬‌‌‌‌‌‌‍\\1&1&1&0&1‌‌‌‌‌‬‍‬‌‌‌‌‌‌‌\\2&0&0&0&1‌‌‌‌‌‬‍‬‌‌‌‌‌‌‍\\3&1&1&1&1‌‌‌‌‌‬‍‬‌‌‌‌‌‌‌\\‌‌‌‌‌‍‌‌‌‌‌‌‬‍‬‌‌‌‌‌‌‍‌‌‌‌‌‬‍‬‌‌‌‌‌‌‌‌‌‌‌‌‬‍‬‌‌‌‌‌‌‍‌‌‌‌‌‬‍‬‌‌‌‌‌‌‍‌‌‌‌‌‬‍‬‌‌‌‌‌‌‌‌‌‌‌‍‍‌‌‌‌‌‍‍‌\end{array}&\begin{array}{c|cc}\text{ABAB}&1&2&3&4&5\\\hline0&0&0&0&0&1\\1&1&1&1&1&1\\2&0&0&0&0&0\\3&0&0&1&0&0\\‌‌‌‌‌‍‌‌‌‌‌‌‬‍‬‌‌‌‌‌‌‍‌‌‌‌‌‬‍‬‌‌‌‌‌‌‌‌‌‌‌‌‬‍‬‌‌‌‌‌‌‌‌‌‌‌‌‬‍‬‌‌‌‌‌‌‍‌‌‌‌‌‬‍‬‌‌‌‌‌‌‍‌‌‌‌‍‍‌‌‌‌‌‍‍‌\end{array}\end{array}\\\begin{array}{c}\begin{array}{c|ccccc}\\\uparrow\uparrow&0&1&2&3&4\\\hline0&1&0&0&0&0\\1&1&1&1&0&1\\2&1&0&1&1&1\\3&0&1&1&1&1\\‌‌‌‌‌‍‌‌‌‌‌‌‬‍‬‌‌‌‌‌‌‍‌‌‌‌‌‬‍‬‌‌‌‌‌‌‌‌‌‌‌‌‬‍‬‌‌‌‌‌‌‍‌‌‌‌‌‬‍‬‌‌‌‌‌‌‌‌‌‌‌‌‬‍‬‌‌‌‌‌‌‌‌‌‌‌‍‍‌‌‌‌‌‍‍‌\end{array}&\begin{array}{c|cc}\\\downarrow\downarrow&0&1&2&3‌‌‌‌‌‬‍‬‌‌‌‌‌‍‌\\\hline0&0&1&0&1‌‌‌‌‌‬‍‬‌‌‌‌‌‌‍\\1&0&0&1&1‌‌‌‌‌‬‍‬‌‌‌‌‌‌‌\\2&1&1&1&1‌‌‌‌‌‬‍‬‌‌‌‌‌‌‌\\3&0&0&0&0‌‌‌‌‌‬‍‬‌‌‌‌‌‌‌\\‌‌‌‌‌‍‌‌‌‌‌‌‬‍‬‌‌‌‌‌‌‍‌‌‌‌‌‬‍‬‌‌‌‌‌‌‍‌‌‌‌‌‬‍‬‌‌‌‌‌‌‍‌‌‌‌‌‬‍‬‌‌‌‌‌‌‌‌‌‌‌‌‬‍‬‌‌‌‌‌‌‌‌‌‌‌‍‍‌‌‌‌‌‍‍‌\end{array}&\begin{array}{c|cc}\\\rightarrow\rightarrow&0&1&2&3&4\\\hline0&0&0&1&1&1\\1&1&0&0&0&1\\2&0&0&1&1&0\\3&1&0&0&1&0\\‌‌‌‌‌‍‌‌‌‌‌‌‬‍‬‌‌‌‌‌‌‍‌‌‌‌‌‬‍‬‌‌‌‌‌‌‌‌‌‌‌‌‬‍‬‌‌‌‌‌‌‍‌‌‌‌‌‬‍‬‌‌‌‌‌‌‌‌‌‌‌‌‬‍‬‌‌‌‌‌‌‌‌‌‌‌‍‍‌‌‌‌‌‍‍‌\end{array}&\begin{array}{c|cc}\\\leftarrow\leftarrow&0&1&2&3‌‌‌‌‌‬‍‬‌‌‌‌‌‍‌\\\hline0&0&0&0&0‌‌‌‌‌‬‍‬‌‌‌‌‌‌‌\\1&0&1&0&0‌‌‌‌‌‬‍‬‌‌‌‌‌‌‌\\2&0&0&1&0‌‌‌‌‌‬‍‬‌‌‌‌‌‌‌\\3&0&1&1&1‌‌‌‌‌‬‍‬‌‌‌‌‌‌‍\\‌‌‌‌‌‍‌‌‌‌‌‌‬‍‬‌‌‌‌‌‌‌‌‌‌‌‌‬‍‬‌‌‌‌‌‌‍‌‌‌‌‌‬‍‬‌‌‌‌‌‌‍‌‌‌‌‌‬‍‬‌‌‌‌‌‌‌‌‌‌‌‌‬‍‬‌‌‌‌‌‌‍‌‬‌‌‌‌‌‌‬‌‌‌‌‍‌‌‌‌‍‍‌‌‌‌‌‍‍‌\end{array}&\begin{array}{c|cc}\text{ABAB}&1&2&3&4&5\\\hline0&1&1&0&1&1\\1&0&0&0&1&0\\2&1&0&1&1&0\\3&1&1&1&0&0\\‌‌‌‌‌‍‌‌‌‌‌‌‬‍‬‌‌‌‌‌‌‍‌‌‌‌‌‬‍‬‌‌‌‌‌‌‌‌‌‌‌‌‬‍‬‌‌‌‌‌‌‌‌‌‌‌‌‬‍‬‌‌‌‌‌‌‍‌‌‌‌‌‬‍‬‌‌‌‌‌‌‍‌‌‌‌‍‍‌‌‌‌‌‍‍‌\end{array}\end{array}\\\begin{array}{c}\begin{array}{c|ccccc}\\\uparrow\uparrow&0&1&2&3&4\\\hline0&0&1&0&0&0\\1&1&0&1&1&1\\2&0&0&0&0&0\\3&1&1&1&1&1\\4&1&0&0&0&0\\\end{array}&\begin{array}{c|cc}\\\downarrow\downarrow&0&1&2&3‌‌‌‌‌‬‍‬‌‌‌‌‌‍‌\\\hline0&0&0&1&1‌‌‌‌‌‬‍‬‌‌‌‌‌‌‍\\1&1&1&1&0‌‌‌‌‌‬‍‬‌‌‌‌‌‌‍\\2&0&0&0&1‌‌‌‌‌‬‍‬‌‌‌‌‌‌‌\\3&1&1&0&1‌‌‌‌‌‬‍‬‌‌‌‌‌‌‍\\4&0&1&0&1‌‌‌‌‌‬‍‬‌‌‌‌‌‌‍\\\end{array}&\begin{array}{c|cc}\text{ABAB}&1&2&3&4&5\\\hline0&0&1&0&1&0\\1&1&1&1&0&1\\2&1&1&0&1&1\\3&1&0&1&0&1\\4&1&0&0&0&1\\\end{array}&\begin{array}{c|cc}\\\leftarrow\leftarrow&0&1&2&3‌‌‌‌‌‬‍‬‌‌‌‌‌‍‌\\\hline0&1&0&1&0‌‌‌‌‌‬‍‬‌‌‌‌‌‌‍\\1&0&1&1&1‌‌‌‌‌‬‍‬‌‌‌‌‌‌‍\\2&0&1&0&1‌‌‌‌‌‬‍‬‌‌‌‌‌‌‍\\3&0&0&1&0‌‌‌‌‌‬‍‬‌‌‌‌‌‌‍\\4&1&1&1&1‌‌‌‌‌‬‍‬‌‌‌‌‌‌‍\\\end{array}&\begin{array}{c|cc}\\\rightarrow\rightarrow&0&1&2&3&4\\\hline0&1&0&0&0&0\\1&1&1&1&1&1\\2&0&1&0&0&0\\3&1&1&0&1&0\\4&1&1&0&0&0\\\end{array}\end{array}\\\begin{array}{c}\begin{array}{c|ccccc}\\\uparrow\uparrow&0&1&2&3&4\\\hline0&1&0&1&1&1\\1&1&0&1&1&1\\2&1&0&1&1&1\\3&1&0&0&0&0\\4&1&1&1&1&1\\\end{array}&\begin{array}{c|cc}\\\downarrow\downarrow&0&1&2&3‌‌‌‌‌‬‍‬‌‌‌‌‌‍‌\\\hline0&0&1&0&1‌‌‌‌‌‬‍‬‌‌‌‌‌‌‍\\1&0&1&0&0‌‌‌‌‌‬‍‬‌‌‌‌‌‌‌\\2&0&1&0&1‌‌‌‌‌‬‍‬‌‌‌‌‌‌‌\\3&0&1&0&1‌‌‌‌‌‬‍‬‌‌‌‌‌‌‌\\4&1&1&0&1‌‌‌‌‌‬‍‬‌‌‌‌‌‌‍\\\end{array}&\begin{array}{c|cc}\\\leftarrow\leftarrow&0&1&2&3‌‌‌‌‌‬‍‬‌‌‌‌‌‍‌\\\hline0&0&0&0&0‌‌‌‌‌‬‍‬‌‌‌‌‌‌‍\\1&0&0&1&1‌‌‌‌‌‬‍‬‌‌‌‌‌‌‌\\2&1&1&0&0‌‌‌‌‌‬‍‬‌‌‌‌‌‌‍\\3&0&1&1&0‌‌‌‌‌‬‍‬‌‌‌‌‌‌‍\\4&1&1&0&0‌‌‌‌‌‬‍‬‌‌‌‌‌‌‍\\\end{array}&\begin{array}{c|cc}\text{ABAB}&1&2&3&4&5\\\hline0&1&0&1&0&1\\1&1&0&1&1&0\\2&0&1&1&0&1\\3&0&0&1&1&1\\4&0&0&0&0&1\\\end{array}&\begin{array}{c|cc}\\\rightarrow\rightarrow&0&1&2&3&4\\\hline0&1&1&1&1&1\\1&0&0&1&1&1\\2&1&1&1&1&1\\3&1&0&1&1&0\\4&1&0&0&1&1\\\end{array}\end{array}\end{array}

这是LaTeX代码,结合官方给出Hint2:笔记是用mardown记录的。

Markdown插入LaTeX公式
CSDN的MarkDown编辑器使用的公式定界符为和$$$,单美元符号包围的是行内公式,双美元符号包围的是块公式

我们知道在mardown语法中两个$$中可以加入LaTeX代码,就会表示成公式。
在这里插入图片描述
在这里插入图片描述

二维码Version

看到5行5列的表格,全是由01组成,想到二维码。
根据题目魂斗罗调30条命,百度发现秘籍是:上上下下左右左右BABA(用上上下下左左右右ABAB来排列)。

但是,23x23尺寸的二维码不合理。

二维码官方叫版本为Version。
二维码一共有40个尺寸。Version 1是21 x 21的矩阵,Version 2是 25 x 25的矩阵,Version 3是29的尺寸,每增加一个version,就会增加4的尺寸,公式是:(V-1)*4 + 21(V是版本号)最高Version 40,(40-1)*4+21 = 177,所以最高是177 x 177 的正方形。

version2 二维码的标准大小应该是25x25。想到零宽字节隐写。

零宽字节隐写

这里用010editor打开,或者在kali下的vim打开字里行间填充的<200c><200c><200c>正是零宽字节的隐写特征。
在这里插入图片描述
在这里插入图片描述
零宽字节隐写解密网站:https://330k.github.io/misc_tools/unicode_steganography.html
注意不要全部复制,要单行解密。
\begin{array}\end{array}
在这里插入图片描述
用上上下下左左右右ABAB来排列(以此类推):

11111 # 上上的第一行
11011 # 下下的第一行
00101 # 左左的第一行
11011 # 右右的第一行
11111 # ABAB的第一行
from PIL import Image
from zlib import *
 
MAX = 25
pic = Image.new("RGB", (MAX, MAX))
str = "1111111011001011101111111100000100011110010100000110111010111011001010111011011101001110101101011101101110100010000000101110110000010010001101010000011111111010101010101111111000000001110111110000000011101111101101010110001000001010110100010100010011100000101100000001111101111101001100100010001000101011111110001000011010110011110000001111100101110010100111000110110100100110100000111101011000001010101111110101111111111110100000000100101101000110111111111011001011101010101100000101111111110001000110111010110000111111101011011101000001100011110110101110101011001111110110110000010100110110110001111111111011110011001100001"
 
i = 0
for y in range(0, MAX):
    for x in range(0, MAX):
        if(str[i] == '1'):
            pic.putpixel([x, y], (0, 0, 0))
        else:
            pic.putpixel([x, y], (255, 255, 255))
        i = i+1
pic.show()
pic.save("flag.png")

在这里插入图片描述
最终生成一个二维码扫描得到flag:BMZCTF{y0u_f1nd_the_4l@g}

三、BMZCTF其他赛题wp

第二届BMZCTF公开赛-easymisc:
https://blog.csdn.net/mochu7777777/article/details/122005160?spm=1001.2014.3001.5501

第二届BMZCTF公开赛-WEB——easy_php、zblog-scshop:
https://seizer.top/post/2022-01/BMZCTF/

BMZCTF官方靶场:
http://www.bmzclub.cn/

第二届“BMZCTF”网络安全公开赛CFS题目WriteUp:
https://www.bll-l.com/index.php/archives/12/

WHT战队博客(BMZCTF往年真题):
https://blog.csdn.net/qq_26243045

第二届“BMZCTF”网络安全公开赛官方解题思路(全部题):
https://mp.weixin.qq.com/s/ZEfY-u9TgkWOgX__BK40mw

posted @ 2022-02-06 18:51  Hardworking666  阅读(417)  评论(0编辑  收藏  举报