当前位置: 首页 > news >正文

CTFMisc之隐写基础学习

0x00 基础概念

本质: “藏信息于无形”。将秘密信息(Payload)嵌入到一个看似无害的普通载体文件(Cover Medium)中,产生一个含密文件(Stego Medium)。关键在于隐蔽性——让观察者无法察觉到秘密信息的存在。

与密码学的区别:

  • 密码学 (Cryptography): 保护信息的内容。信息是可见的(乱码),但无法理解。
  • 隐写术 (Steganography): 保护信息的存在本身。信息被隐藏起来,观察者不知道有秘密存在。

CTF解题目标:

  • 检测 (Detection): 判断给定文件是否可能包含隐藏信息(寻找异常)。
  • 提取 (Extraction): 使用正确的工具和技术,无损地将隐藏信息(Flag)取出。
  • 理解/解码 (Decoding): 提取出的信息可能需要进一步解码(Base64, Hex, 二进制等)或解密才能得到Flag
  • 核心挑战: 信息隐藏的方式千变万化,需要敏锐的观察力、对文件格式的理解、熟悉各种工具以及一定的创造力。

0x01 隐写术分类

  1. 按载体类型 (Cover Medium)

    • 图像隐写 (Image Steganography): 最常见。载体:JPG, PNG, BMP, GIF, TIFF, WebP等。
    • 音频隐写 (Audio Steganography): 载体:WAV, MP3, FLAC, OGG, AU等。
    • 视频隐写 (Video Steganography): 载体:MP4, AVI, MOV, WebM等。可视为图像+音频隐写的组合,或利用帧间特性、时间戳。
    • 文本隐写 (Text Steganography): 载体:TXT, HTML, PDF, DOCX, PPTX,甚至源代码文件。隐蔽性高,检测难。
    • 文件结构隐写 (File Structure Steganography): 利用文件格式本身的特性:
    • 文件拼接/附加 (Appending/Concatenation): 将秘密文件(如ZIP)直接附加到载体文件末尾。
    • 文件容器 (File Containers): 将文件藏在另一个文件的未使用空间(如ZIP in PNG)。
    • 元数据 (Metadata): 在文件头尾、注释区或专用字段(如EXIF, ID3)中隐藏信息。
    • 特殊文件系统特性: 如NTFS交换数据流(ADS)。
    • 网络协议隐写 (Network Protocol Steganography): 在网络包(IP/TCP头字段、时序、包序)中隐藏信息(多见于流量分析题)。
    • 其他载体: 可执行文件(EXE)、文档(PDF深层对象)、文件系统镜像、甚至二维码/条形码。
  2. 按信息嵌入方式 (Embedding Method) - 主要针对数字媒体

    • 空域/时域隐写 (Spatial/Temporal Domain): 直接修改原始数据。
    • 最低有效位 (LSB - Least Significant Bit): 最最常用! 修改像素颜色值(R/G/B/Alpha)或音频样本值的最低1-N位。
    • 位平面操作: 操作图像的不同比特位平面。
    • 变换域隐写 (Transform Domain): 修改载体在变换域(如频域)的系数。
    • 离散余弦变换 (DCT)JPEG图像核心,在DCT系数(尤其AC系数)中嵌入。
    • 离散小波变换 (DWT): 在图像/音频的小波系数中嵌入。
    • 离散傅里叶变换 (DFT): 在频域系数中嵌入。
    • 压缩域隐写: 直接在压缩后的数据流(如JPEG的熵编码流、MP3帧)中嵌入。
    • 生成式隐写: 利用AI模型(如GAN)生成本身就包含隐藏信息的载体。
    • 利用格式特性: 如GIF的调色板排序、PNG的辅助块(tEXt, zTXt)、文件格式的填充区/保留区。

0x02 元数据 (Metadata)

  • 图像 EXIF:数码照片的元信息(相机型号、时间、GPS、注释等)。Flag常藏在Comment、Artist、Copyright、Software、UserComment、XPComment等字段。
  • 音频 ID3 TagsMP3等文件的元信息(标题、艺术家、专辑、注释等)。
  • 文档属性: PDF、Office文档的属性(标题、作者、主题、关键词、自定义属性)。
  • 文件头尾: 在标准文件头/尾的保留或填充区域写入数据。十六进制编辑器仔细检查。
    在这里插入图片描述
    也可以用exiftool直接查看
    在这里插入图片描述

0x03 图片宽高修改

PNG图片格式
  • PNG的宽高存储在 IHDR块的前8个字节(宽度4字节 + 高度4字节),位置固定;
  • IHDR块位置:紧接文件头后的 13字节处 开始(第13-16字节为宽度,第17-20字节为高度)。
    在这里插入图片描述
    上面为正常图片,用010editor打开
    在这里插入图片描述
    02B1修改为01B1,长度缩短以后,flag就能被隐藏起来了
    在这里插入图片描述
    还可以拿脚本进行爆破
import binascii
import struct
import os
crcbp = open("flag.png","rb").read()#填文件名
for i in range(1024):for j in range(1024):data = crcbp[12:16] + struct.pack('>i',i) + struct.pack('>i',j) + crcbp[24:29]crc32 = binascii.crc32(data) & 0xffffffffif crc32 == 0x3a9ffab2 :#此处填CRC值print (i);print (j);print (hex(i),hex(j))
JPG图片格式
  • JPG的宽高存储在SOF0段(Start of Frame),位置不固定,需扫描标记,结构更复杂:
  • 文件头:以 FF D8 FF 开头。
  • SOF0标记:通过扫描 FF C0FF CF 之间的标记定位(常见为 FF C0)。
  • 宽高位置:在SOF0标记后第5字节开始(2字节高度 + 2字节宽度)。

JPG图片中修改宽度导致图片混乱而修改高度不会,这是由于JPG的压缩原理和MCU(最小编码单元)机制导致的。

MCU的作用:

  • JPG将图像分割为多个8×8像素的块(称为MCU
  • 宽度方向必须对齐MCU边界(通常是816像素的倍数)
  • 若修改后的宽度不是MCU的整数倍,解码器无法正确重建图像

高度与宽度的不对称性:

  • 高度:可任意修改(只需是整数行),解码器按行处理
  • 宽度:必须满足 width % MCU_width == 0(否则破坏块对齐)
    在这里插入图片描述
    下面是一张正常的jpg
    在这里插入图片描述
    通过010editor打开,查询ffc0后,修改高的值
    在这里插入图片描述
    修改后,可以隐藏flag
    在这里插入图片描述

0x04 GIF隐写

1)基于图像的隐写。GIF中可以包含多个图像,出题人可以在某幅图像傻姑娘隐写信息。我们需要分离出GIF的每幅图片,并针对每幅图片进一步分析。用Stegsolve可以一帧一帧查看,往往答案就隐藏在其中一帧

在这里插入图片描述
2)基于时间的隐写。这种方式非常隐蔽,因为GIF中的每幅图像都会有延迟时间,可以约定不同的延迟时间代表不同的含义,例如延迟100ms代表1,延迟50ms代表0,从而达到传输秘密信息的目的。可以通过命令获取GIF每帧的延迟时间
在这里插入图片描述
用软件对比了下时间,一个是4一个是40
在这里插入图片描述
查了下资料-format相关的资料
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
所以基于以上信息来看是没毛病的

0x05 文件附加/拼接 (File Appending)

原理: 将另一个完整文件(常是ZIP, RAR, PDF, 另一张图)直接追加到载体文件末尾。文件解析器会忽略尾部多余数据。
载体: 任何文件类型,图片最常见。
检测:

  • 文件大小: 异常大。
  • binwalkbinwalk stego.jpg 扫描内部文件签名。看到 Zip archive dataRAR archive data 就是铁证。
  • 十六进制编辑器: 查看文件尾部,寻找PK(ZIP), Rar!(RAR), %PDF(PDF)等魔术头。
  • stringsstrings stego.jpg | grep -i "flag" 或搜索 PK/Rar

先制作一个文件带压缩文件的图片
在这里插入图片描述

提取方式:
  • binwalk -e 尝试自动提取。
    在这里插入图片描述
  • dd: 根据binwalk或编辑器找到的偏移量(offset),精确切割
    在这里插入图片描述
    dd if=stego.jpg of=secret.zip skip=123456 bs=1 skip=78804
    在这里插入图片描述
  • foremost:类似于binwalk的工具,新版kali已经默认不安装了
  • 改后缀: 尝试将文件后缀改为ziprar,直接解压。

0x06 最低有效位 (LSB)

原理: 数字图像像素(RGB8位,共24位)或音频样本(如16位)的最低几位对人眼/耳感知影响最小。用秘密信息的比特流替换这些LSB
载体偏好: PNG(无损,完美)、BMP(未压缩)、WAV(未压缩音频)。
检测:
视觉/听觉: 大量修改时,图像可能在纯色区域出现细微噪点/色偏;音频可能有轻微底噪。
统计分析: 检查LSB位平面0/1分布是否偏离随机。
工具扫描: zsteg (专攻PNG/BMP)、Stegsolve (Java,可视化分析位平面)、stego-lsb (Python库)。
下面是一个用于写入lsb的脚本

from PIL import Imagedef hide_message_in_image(image_path, message, output_path):# 加载原始图像img = Image.open(image_path)img = img.convert("RGB")# 将文本转换为二进制字符串message_binary = ''.join([format(ord(char), '08b') for char in message])# 获取图像像素数据pixels = img.load()pixel_index = 0message_length = len(message_binary)# 遍历像素并替换LSBfor row in range(img.size[1]):for col in range(img.size[0]):if pixel_index < message_length:# 获取当前像素的R, G, B值pixel = list(pixels[col, row])# 替换R, G, B值中的最低有效位pixel[0] = pixel[0] & ~1 | int(message_binary[pixel_index])pixel[1] = pixel[1] & ~1 | int(message_binary[pixel_index + 1])pixel[2] = pixel[2] & ~1 | int(message_binary[pixel_index + 2])pixel_index += 3# 将修改后的像素数据写回图像pixels[col, row] = tuple(pixel)else:breakelse:continuebreakimg.save(output_path)print("Message hidden successfully!")hide_message_in_image("lsbtest.png","flag{hiehiehie}","png_lsb.png")

stegslove可以解决,直接看到flag
在这里插入图片描述

0x07 word隐写

  • word中隐藏字段:在Word中选中要隐藏的字段,右击选择字体选项,在效果一栏中有隐藏选项,选中后即可隐藏。默认情况下隐藏文字是不会被打印出来的。
    在这里插入图片描述
    隐藏后如下
    在这里插入图片描述
  • 白色背景下的白字无法被识别出有隐藏的文字。
    破解:全选改字体颜色为别的颜色、搜索字符串,例如flag
    在这里插入图片描述
  • word中隐藏图片:word中插入的图片分为嵌入式和非嵌入式,区别在嵌入式会跟着文本的位置产生移动,即有回车后,图片下移。但非嵌入的不会跟着文本走,即有回车后,图片保持原位置不动。
    破解: word改后缀名为zip然后解压
    在这里插入图片描述
    比如这张图在设置嵌入式后,设置成在文本下方,就伪装成了水印的效果,其实是藏了一张图片在这里。

0x08 JPEG 隐写

原理: 在JPEG压缩过程中的量化DCT系数(尤其是中频系数)中嵌入信息,比LSB更抗有损处理。
工具:
outguess: 经典工具,有特定变种。outguess -r stego.jpg output.txt (可能需要-k指定密钥)。
jsteg: 较老的JPG隐写工具。jsteg reveal stego.jpg output.txt
stegseek: 针对steghide的暴力破解工具,速度快。stegseek stego.jpg wordlist.txt

安装outguess
git clone https://github.com/crorvick/outguess.git
cd outguess
./configure && make && sudo make install
加密数据
outguess -k "your-secret-key" -d secret.txt carrier.jpg output.jpg

在这里插入图片描述

解密数据
outguess -k "your-secret-key" -r output.jpg extracted.txt

在这里插入图片描述

0x09 音频隐写 (Audio Steganography)

常见技术: LSB、频谱隐写(在声谱图中藏图/二维码)、相位编码、回声隐藏、扩频隐写。
工具:

  • Audacity查看波形、频谱图(Spectrogram)、分析音轨。
  • Sonic Visualiser: 专业音频分析,多种视图/插件。
  • steghide: 支持WAV/AU
  • DeepSound: 支持在音频中隐藏文件和加密。
  • stego-lsb: 支持WAV音频的LSB隐写。
    在这里插入图片描述
    比如这个就是摩斯密码

0x10 伪加密 (Fake Encryption)

ZIP/RAR文件设了密码但实际为空、弱密码或已知密码。

  • 无加密
    压缩源文件数据区的全局加密应当为0000 (504B0304两个bytes之后)
    且压缩源文件目录区的全局方式位标记应当为0000 (504B0304四个bytes之后)
  • 假加密
    压缩源文件数据区的全局加密应当为0000
    且压缩源文件目录区的全局方式位标记应当为0900
  • 真加密
    压缩源文件数据区的全局加密应当为0900
    且压缩源文件目录区的全局方式位标记应当为0900
    在这里插入图片描述

0x11 损坏的文件头

故意修改文件头魔术字节(Magic Bytes)使其看起来损坏或类型错误(如PNG改成了JPG头)。

CTF中常见文件的文件头(十六进制)

jpg	FF D8 FF E0或FF D8 FF E1或FF D8 FF E8
png	89 50 4E 47
bmp	42 4D 36 5D
gif	47 49 46 38
zip	50 4B 03 04
rar	52 61 72 21
mp3	49 44 33 03
wav	52 49 46 46

可以使用file命令识别后,用十六进制工具补充或者修改
在这里插入图片描述

0x12 结束

列举了常见的一些方法,还有很多没有时间整理和总结,用到的时候再说吧(应该对我来说没啥机会吧),学不会真的学不会

http://www.dtcms.com/a/283121.html

相关文章:

  • 重学前端007 --- CSS 排版
  • day22 力扣77.组合 力扣216.组合总和III 力扣17.电话号码的字母组合
  • 异常流程进阶 —— 进出异常时的压栈与出栈
  • LVS集群搭建
  • 【Excel】使用vlookup函数快速找出两列数据的差异项
  • 零基础学Vue3组件化开发
  • 使用Python清理Excel中的空行和单元格内部空行:初学者指南
  • Excel处理控件Aspose.Cells教程:使用 Python 在 Excel 中创建甘特图
  • EP02:【NLP 第二弹】自然语言处理数据
  • Oracle 大页配置use_large_pages 参数解析
  • Antd中使用Table集成 react-resizable实现可伸缩列
  • 高性能上位机界面设计范式:C#与C++/C开发调试无缝衔接
  • AR智能巡检:电力运维的数字化变革
  • Raydium CLMM 协议
  • Kotlin比较接口
  • 安全初级作业2
  • HTTP vs HTTPS
  • RabbitMQ工作模式
  • Python类中魔术方法(Magic Methods)完全指南:从入门到精通
  • 分布式系统高可用性设计 - 监控与日志系统
  • 风电箱变、风机、升压站等场景在线监测:助力电力系统稳定可靠运行
  • [论文阅读] 人工智能 + 软件工程 | 用交互式可视化革新软件文档:Helveg工具的设计与改进
  • 21、鸿蒙Harmony Next开发:组件导航(Navigation)
  • 0系统与软件工程-标准体系
  • 【多线程的常见使用场景】
  • 工业自动化中EtherCAT转Profinet网关的速度控制模式配置与优化
  • 破壳萌图鉴(宝可梦) 2.1.2311052226/界面简洁流畅,没有广告
  • Optional:orElse 和 orElseGet 的底层逻辑,决定了它们的本质区别
  • 大模型呼叫系统选型指南:以云蝠智能VoiceAgent为核心的企业升级路径
  • Linux 下安装DM8数据库详细教程