尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

CTFmisc图像隐写实战:从zsteg提取到零宽字节解密的完整链条

CTFmisc图像隐写实战:从zsteg提取到零宽字节解密的完整链条 1. 图像隐写术入门从zsteg发现隐藏线索第一次参加CTF比赛时我遇到一张看似普通的魂斗罗游戏截图队友随手用zsteg扫描后竟然发现了隐藏的压缩包这种神奇体验让我彻底迷上了图像隐写术。PNG文件就像个多层蛋糕除了肉眼可见的像素层还可能包含以下隐藏数据层IDAT块存储实际图像数据的核心区域tEXt/zTXt块可嵌入文本注释时间戳记录文件修改历史物理像素尺寸定义打印时的实际大小调色板索引颜色模式下的色彩映射表实战中最常用的工具就是zsteg这个用Ruby写的神器能自动检测PNG文件中各种异常数据。记得有次比赛我用这个命令发现了关键线索zsteg -a suspect.png输出中的extradata:0后面跟着PK字样这就是ZIP文件的魔法头50 4B。提取隐藏压缩包只需要zsteg -E extradata:0 suspect.png hidden.zip2. 压缩包修复实战从碎片重组到密码破解拿到损坏的压缩包就像得到个摔碎的存钱罐需要耐心拼凑。那次比赛我们遇到的压缩包缺失了关键文件头用010editor打开看到满屏的十六进制代码时新手可能会头晕但其实只需记住几个关键标记十六进制ASCII含义结构作用50 4B 03 04PK..本地文件头签名50 4B 01 02PK..中央目录文件头记录50 4B 05 06PK..结束中央目录记录修复步骤其实很有逻辑用WinHex搜索所有50 4B出现的位置确认03 04、01 02、05 06三个关键段的完整性补全缺失的字节头那次比赛我们缺了05 06段的头用WinRAR的修复功能自动重组文件结构更刺激的是遇到加密压缩包那次我们通过CRC校验错误意外发现了密码提示。PNG的IDAT块CRC校验失败时错误信息里藏着十六进制字符串转换成文本后得到关键提示异或0x03后Base64解码。用Python三行代码就破解了密码import base64 decoded bytes([ord(c)^0x03 for c in U1kkgG:VbDE3[1oy[1EeDEy0ghSzF]) print(base64.b64decode(decoded).decode())3. Markdown与LaTeX的隐藏维度解压得到的flag.txt打开后全是乱码别急这可能是个精心设计的MarkdownLaTeX谜题。那次比赛我们遇到的文档看似混乱实则包含三重编码Markdown容器用包裹的代码块LaTeX矩阵\begin{array}定义的5x5二进制矩阵零宽字符在行列标识间隐藏的Unicode 200B-200F关键破解步骤把文档保存为.md后缀用Typora等支持LaTeX渲染的Markdown编辑器打开观察渲染后的矩阵排列规律我们那次是上上下下左右左右BABA用vim的:set list命令显示隐藏字符最精妙的是发现这些二进制矩阵实际对应二维码的模块。通过Python的PIL库可以将其可视化from PIL import Image matrix 1111111011001011101111111100000100011110010100000110111010111011001010111011011101001110101101011101101110100010000000101110110000010010001101010000011111111010101010101111111000000001110111110000000011101111101101010110001000001010110100010100010011100000101100000001111101111101001100100010001000101011111110001000011010110011110000001111100101110010100111000110110100100110100000111101011000001010101111110101111111111110100000000100101101000110111111111011001011101010101100000101111111110001000110111010110000111111101011011101000001100011110110101110101011001111110110110000010100110110110001111111111011110011001100001 img Image.new(1, (25,25)) img.putdata([int(p) for p in matrix]) img.save(qr.png)4. 零宽字节的终极挑战当所有线索指向二维码却仍然无法解码时就要考虑最隐蔽的零宽字节隐写了。这种技术在CTF中常见的有三种变体Unicode零宽字符U200B零宽度空格U200C零宽度非连接符U200D零宽度连接符UFEFF字节顺序标记文本水印通过特定算法在可见字符间插入不可见标记格式控制符利用回车符、制表符等控制字符编码信息那次比赛我们使用在线工具解密时踩了个坑直接复制整个LaTeX代码会导致解析失败。正确做法应该是用vim的:%s/\%u200b/0/g命令替换零宽字符逐段复制到解密网站推荐https://330k.github.io/misc_tools/unicode_steganography.html根据魂斗罗秘籍的上上下下左右左右BA顺序排列二进制位最终得到的25x25二维码矩阵用Python生成后扫描终于弹出那令人激动的flagBMZCTF{y0u_f1nd_the_4lg}。这种从像素到压缩包从文本到二维码的完整破解链条正是CTF图像隐写题最迷人的魅力所在。
返回列表