杂项 Misc

MISCELLANEOUS — CTF 最佳入门方向

方向简介(选自 CTF Wiki · 杂项简介)

Misc 是英文 Miscellaneous 的前四个字母,杂项、混合体、大杂烩的意思。Misc 在国外的比赛中其实又被具体划分为各个小块:

  • Recon(信息搜集)
  • Forensic(数字取证)
  • Stego(隐写分析)
  • Misc(其他杂项)

在国内的比赛中,被统一划分入 Misc 领域,有时 Crypto(尤其是古典密码)也被划入其中。CTF Wiki 从以下几个方面介绍:

  • Recon(信息搜集):主要介绍一些获取信息的渠道和一些利用百度、谷歌等搜索引擎的技巧
  • Encode(编码转换):CTF 比赛中一些常见的编码形式以及转换的技巧和常见方式
  • Forensic && Stego(数字取证 && 隐写分析):Misc 中最为重要的一块,包括文件分析、隐写、内存镜像分析和流量抓包分析等等,涉及巧妙的编码、隐藏数据、层层嵌套的文件中的文件,灵活利用搜索引擎获取所需要的信息等

Misc 是切入 CTF 竞赛领域、培养兴趣的最佳入口。Misc 考察基本知识,对安全技能的各个层面都有不同程度的涉及,可以在很大程度上启发思维。想学网安又不知道从哪开始?就从 Misc 开始。

📌 完整内容见 CTF Wiki · 杂项简介。

编码分析详解(选自 CTF Wiki · 计算机相关的编码)

① 字母表编码

A-Z / a-z 对应 1-26 或 0-25。例如 15 14 3 即 NUC(13 空格?实际 15=N,14=O,3=C —— NOC)。出现「纯数字、范围 1~26」要想到字母表。

② ASCII 编码

我们一般使用的 ASCII 编码采用的都是可见字符,而且主要是如下字符:

  • 0-9 → 48-57
  • A-Z → 65-90
  • a-z → 97-122

变形 1 · 二进制编码:把 ASCII 码对应的数字换成二进制表示,只有 0 和 1,不超过 8 位。

变形 2 · 十六进制编码:换成十六进制,如 A-Z → 0x41~0x5A、a-z → 0x61~0x7A。

# Python 快速转换
s = "01001000 01100101 01101100 01101100 01101111"   # 二进制
print("".join(chr(int(x, 2)) for x in s.split()))     # Hello

h = "48656C6C6F"                                      # 十六进制
print(bytes.fromhex(h))                               # b'Hello'

③ Base 编码(重点)

base xx 中的 xx 表示的是采用多少个字符进行编码。比如 base64 采用 64 个字符(A-Z、a-z、0-9、+、/),由于 2 的 6 次方等于 64,所以每 6 个比特为一个单元,对应某个可打印字符。3 个字节有 24 个比特,对应 4 个 Base64 单元。

  • base64 结尾可能会有 = 号,但最多 2 个
  • base32 使用 32 个可见字符,每 5 bit 一个分组,结尾最多 6 个 =
  • 根据 base 的不同,字符集会有所限制;= 的 hex 是 3D
import base64
print(base64.b64encode(b"flag"))      # b'ZmxhZw=='
print(base64.b64decode("ZmxhZw=="))   # b'flag'
# base32 / base16 同理:base64.b32encode / b16encode

④ XXencode

XXencode 将输入文本以每三个字节为单位进行编码,以 6bit 为单位分为 4 个组,用位置字符代替。特点:只有数字、大小写字母、+ 号、- 号。在线工具:web.chacuo.net/charsetxxencode。

⑤ URL 编码

也叫百分号编码,特点:大量的百分号,如 %66%6C%61%67(flag)。%20 是空格、%27 是单引号。CTF 中常与注入绕过结合。

⑥ Unicode 编码

注意它有四种表现形式(源文本 The):

  • The(&#x [Hex])
  • The(&# [Decimal])
  • \U0054\U0068\U0065(\U)
  • \U+0054\U+0068\U+0065(\U+)

⑦ 摩斯电码 / 二维码 / 培根密码等

这些属于「现实世界中常用的编码」:摩斯(. - 组合)、二维码(QR 直接扫)、培根密码(5 位 0/1 或 a/b 组合)。看到「点横」「黑白格子」「两个字符的序列」就往这些方向想。

隐写与取证(Forensic & Stego)

隐写取证是 Misc 中最为重要的一块,包括文件分析、隐写、内存镜像分析和流量抓包分析等。CTF 中 Misc 与现实取证不同:现实取证多为恢复残损文件、挖掘硬盘痕迹;而 CTF 中更多是巧妙的编码、隐藏数据、层层嵌套的文件。

图片隐写常见手法

  • PNG 宽高修改:图片被裁掉,改文件头 IHDR 里的高度还原(见练习题「大白」)
  • LSB 隐写:把信息藏在像素颜色的最低位,用 StegSolve / zsteg 提取
  • GIF 分帧:每一帧是黑白图,转二进制(见练习题「gif」)
  • 文件拼接:图片后面藏了 zip/rar(用 binwalk 或 winhex 看文件尾)
  • EXIF 信息:右键属性 → 详细信息里藏注释

音频隐写

  • 用 Audacity 查看频谱图,flag 可能直接画在频谱里
  • 音频倒放(Reverse)隐藏信息;摩斯音频

压缩包分析

  • 伪加密:ZIP 加密标志位被篡改(010 Editor 改回来)
  • 暴力破解:ARCHPR / fcrackzip 跑字典
  • 明文攻击:知道压缩包内某个文件内容时

流量包与磁盘内存分析

流量包分析(Wireshark)

  • 打开 .pcap 文件,用 http / ftp / dns 等过滤器缩小范围
  • 「跟踪 TCP 流 / HTTP 流」看完整请求;文件传输可以导出文件
  • USB 流量:键盘流量还原按键;蓝牙、WiFi 握手包破解
  • 数据提取:在流量里找 flag、Base64 串、上传的文件

磁盘/内存分析

  • 内存镜像:Volatility 分析内存 dump,提取进程、文件、密码
  • 磁盘镜像:用取证工具挂载镜像,找删除的文件(foremost 恢复)

工具清单(新手先装这些)

工具用途
010 Editor / WinHex十六进制编辑器,看/改文件头
binwalk分析文件内嵌的其他文件
StegSolve图片隐写分析(通道查看、LSB)
zsteg / stegsolveLSB 隐写提取
Wireshark流量包分析
Audacity音频分析(频谱)
ARCHPR压缩包密码破解
Volatility内存取证(进阶)
Python + PIL写脚本拆帧、改像素、转编码

入门挑战 · 练习题(附 WP 与直达链接)

BUUCTF大白PNG 宽高隐写★☆☆ 去题目
📖 查看 WP 题解

场景:下载「大白」图片(附件在 BUUCTF 题目页下载),打开发现图片显示不全,flag 藏在被裁掉的部分。

1思路:PNG 的宽高记录在 IHDR 块,出题人把高度改小了。
2看文件头:用 WinHex / 010 Editor 打开,PNG 偏移 16-19 是宽度、20-23 是高度。
3改高度:把高度改成与宽度相同,保存重新打开即可看到 flag。
import struct
data = open('dabai.png', 'rb').read()
w = struct.unpack('>I', data[16:20])[0]   # 宽度
print('width =', hex(w))
data = data[:20] + struct.pack('>I', w) + data[24:]  # 高度改为宽度
open('dabai_fixed.png', 'wb').write(data)
4拿 flag:打开修复图 → flag{...}

💡 「图片长宽不符 = 改宽高」是 Misc 最经典套路之一。

攻防世界gifGIF 分帧隐写★☆☆ 去题目
📖 查看 WP 题解

场景:一个 gif 有很多帧,每帧是黑白小图。

1思路:黑白 = 0/1,每帧转 1 bit,8 bit 一组转 ASCII。
from PIL import Image
im = Image.open('gif.gif')
bits, frame = '', 0
while True:
    try:
        im.seek(frame)
        px = im.convert('L').getpixel((0, 0))
        bits += '0' if px < 128 else '1'   # 若乱码则交换 0/1
        frame += 1
    except EOFError:
        break
print("".join(chr(int(bits[i:i+8], 2)) for i in range(0, len(bits), 8)))
2拿 flag:flag{...}

💡 同类套路:二维码、LSB、字符画,本质都是「信息藏在视觉冗余里」。