CTF Misc 隐写术实战:从 JPG 尾部数据到 Gnuplot 绘图的 3 步解码 📅 2026/7/12 4:27:13 CTF Misc 隐写术实战从 JPG 尾部数据到 Gnuplot 绘图的完整解码指南1. 隐写术基础与 JPG 文件结构解析在 CTF 竞赛的 Misc 类别中隐写术Steganography是最常见也最富挑战性的题型之一。不同于传统的加密技术隐写术更注重如何巧妙地将信息隐藏在看似普通的载体文件中而 JPG 图像因其广泛使用和复杂的文件结构成为隐写术的理想载体。JPG 文件的核心结构SOI 标记0xFFD8表示文件开始APPn 段存储元数据如相机型号、拍摄时间等DQT/DHT 段量化表和霍夫曼表SOF0 段图像基本信息宽高、色彩分量等SOS 段实际图像数据开始EOI 标记0xFFD9表示文件结束关键提示隐写数据通常被附加在 EOI 标记之后因为大多数图像查看器会忽略这些多余数据。2. 实战案例BUUCTF 梅花香之苦寒来2.1 初始分析与数据提取首先使用十六进制编辑器如 010 Editor检查文件xxd challenge.jpg | tail -n 20典型异常特征在FF D9结束标记后存在大量数据数据呈现规律性十六进制数值如30 31 30 32等Python 提取脚本with open(challenge.jpg, rb) as f: data f.read() eoi_pos data.find(b\xFF\xD9) if eoi_pos ! -1: hidden_data data[eoi_pos2:] with open(hidden.hex, wb) as out: out.write(hidden_data)2.2 数据格式转换与解析提取到的数据通常是以下形式之一原始坐标点如(x,y)格式二进制编码的像素数据特殊编码的文本信息十六进制转 ASCII 脚本with open(hidden.hex, rb) as h: hex_data h.read().decode(ascii).strip() coordinates [] for i in range(0, len(hex_data), 4): x int(hex_data[i:i2], 16) y int(hex_data[i2:i4], 16) coordinates.append(f{x} {y}\n) with open(coordinates.txt, w) as f: f.writelines(coordinates)2.3 数据可视化工具链Gnuplot 安装与配置# Ubuntu/Debian sudo apt install gnuplot # macOS brew install gnuplot关键配置参数set terminal pngcairo size 800,800 enhanced font Arial,12 set output qr.png unset key unset border unset xtics unset ytics set size square plot coordinates.txt with points pointtype 5 pointsize 1自动化绘图脚本#!/bin/bash gnuplot EOF set terminal png size 800,800 set output output.png set margins 0,0,0,0 unset key; unset border; unset xtics; unset ytics plot coordinates.txt with points pt 7 ps 0.5 lc black EOF3. 进阶技巧与异常处理3.1 常见数据异常情况问题类型解决方案检测方法坐标顺序错乱排序处理检查数值范围数据含噪声滤波处理统计频率分析非标准编码尝试Base64/二进制转换文件头分析3.2 二维码识别优化当生成图像模糊时from PIL import Image import pytesseract img Image.open(output.png) img img.convert(L).point(lambda x: 0 if x128 else 255, 1) img.save(enhanced.png)3.3 自动化工具链整合完整处理流程使用binwalk初步检测foremost分离潜在文件自定义 Python 解析脚本Gnuplot 可视化Zbarimg 二维码识别#!/bin/bash # 自动化处理流程 binwalk -e challenge.jpg python3 extract_coordinates.py gnuplot plot_script.gp zbarimg -q enhanced.png4. 实战演练与技巧总结4.1 典型解题步骤文件检测file challenge.jpg binwalk challenge.jpg数据提取# 提取最后1KB数据 with open(challenge.jpg, rb) as f: f.seek(-1024, 2) print(f.read().hex())格式转换# 二进制转ASCII xxd -r -p hidden.hex decoded.txt数据清洗# 过滤无效坐标 clean_data [p for p in raw_data if 0 p[0] 100 and 0 p[1] 100]4.2 效率优化技巧使用numpy加速数据处理import numpy as np coords np.loadtxt(coordinates.txt) np.savetxt(sorted.txt, coords[np.lexsort((coords[:,1], coords[:,0]))])批量处理脚本for f in *.jpg; do python extract.py $f gnuplot -c plot.gp ${f%.*}.txt done4.3 常见陷阱识别伪结束标记多个FF D9序列加密数据需要 XOR 或位移处理非常规编码尝试颠倒字节序复合隐写结合 LSB 和文件尾数据# XOR 解密示例 key 0x55 decrypted bytes([b ^ key for b in hidden_data])在 CTF 竞赛中遇到这类题目时保持耐心和系统性思维至关重要。建议建立自己的工具库将常用脚本模块化。我通常会准备一个包含各种文件分析脚本的目录遇到新题型时快速组合现有工具进行测试。