签到题
签到题,顾名思义,就是用来签到的题目,简单到甚至不需要思考就可以做出来。
实际上,你并不需要真的把签到题作为签到——没有规定说明只有做过签到题才算开始比赛。你可以优先去做高难题,拿下前三血。
不过,作为新手,签到题是为数不多的拿分项目了,CTF 普遍要难于其他计算机相关竞赛。
签到题不会放在固定的题目位置,你需要自己判别哪一道题目是签到题。
有的时候主办方会在题干里告诉你这是签到题,甚至告诉你这题的解法,相当于把答案告诉你了。
一、文件转换类
主办方可能会将图片、二进制文件等直接以 .txt 形式给出。直接查看会因格式不匹配而看到一团乱码。
陷阱: 文件扩展名不可信。需要判断文件原始格式。
判断原始格式
| 系统 | 方法 |
|---|---|
| Windows | 右键 -> 属性(查看”类型”或”以前版本”);或用 file 命令(需安装 Git Bash / WSL) |
| Linux | file flag.txt |
| macOS | file flag.txt |
PNG -> TXT 恢复
陷阱: flag 隐藏在转换后的图片中,直接 cat 看到乱码。
| 系统 | 解法 |
|---|---|
| Linux | cat flag.txt | sixel2png > flag.png(需安装 libsixel) |
| Windows | 用 WSL 执行 Linux 命令;或用 Python: with open('flag.txt','rb') as f: open('flag.png','wb').write(f.read()) |
| macOS | 同 Linux,安装 libsixel(brew install libsixel) |
JPG -> TXT 恢复
| 系统 | 解法 |
|---|---|
| Linux | cp flag.txt flag.jpg && xdg-open flag.jpg |
| Windows | 复制文件 -> 改后缀为 .jpg -> 打开 |
| macOS | 同 Linux,open flag.jpg |
二进制文件被转为 hex dump
陷阱: 文件内容由十六进制文本表示,直接 cat 看到 hex 字符串而非二进制。
| 系统 | 解法 |
|---|---|
| Linux | xxd -r -p flag.txt flag.bin && file flag.bin |
| Windows | 使用 Python: bytes.fromhex(open('flag.txt').read()) 写入二进制文件;或安装 Cygwin 的 xxd |
| macOS | 同 Linux: xxd -r -p flag.txt flag.bin |
二、编码解码类
这是最常见的一类签到题。flag 被某种编码方式编码后直接给出。
Base64
陷阱: 肉眼无法直接看出编码后的 flag,需要解码。
Base64 特征:仅含 A-Za-z0-9+/=,长度通常是 4 的倍数。
| 系统 | 解法 |
|---|---|
| Linux | echo "base64string" | base64 -d;或 cat flag.txt | base64 -d |
| Windows | PowerShell: [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String("base64string")) |
| macOS | 同 Linux: echo "base64string" | base64 -D(注意 macOS 用 -D 而非 -d) |
Base32 / Base16
陷阱: 与 Base64 类似但字符集不同。
Base32 特征:大写字母 + 数字,长度是 8 的倍数。
Base16 特征:0-9A-F(即 hex)。
| 系统 | 解法 |
|---|---|
| Linux | base32 -d flag.txt;xxd -r -p flag.txt(即 hex) |
| Windows | 在线工具;或 Python: import base64; base64.b32decode("...") |
| macOS | 同 Linux |
ROT13 / 凯撒密码
陷阱: flag 看起来像乱序字母,实际是字母移位加密。
ROT13 特征:字母范围 A-Za-z,每个字符向后移 13 位(ROT13 是可逆的,再应用一次即还原)。
| 系统 | 解法 |
|---|---|
| Linux | echo "synt{...}" | tr 'A-Za-z' 'N-ZA-Mn-za-m' |
| Windows | PowerShell: -join([char[]]"synt{..." | %{if($_ -ge 97-and $_ -le 109-or $_ -ge 65-and $_ -le 77){[char]($_+13)} elseif($_ -ge 110-and $_ -le 122-or $_ -ge 78-and $_ -le 90){[char]($_ -13)} else{$_}}) |
| macOS | 同 Linux |
摩斯电码
陷阱: flag 由 . - 和空格组成,需解码。
| 系统 | 解法 |
|---|---|
| 全平台 | 在线解码(搜索 Morse Code Decoder);或使用 Python 库 morse3 / 自写映射表 |
| Linux | apt install morse -> morse -d flag.txt |
三、网页类签到
查看页面源代码
陷阱: flag 直接藏在 HTML 注释中。
| 系统 | 解法 |
|---|---|
| Windows | 浏览器 -> Ctrl+U(查看源代码) |
| Linux | curl -s http://target.com | grep -i flag |
| macOS | 同 Linux |
浏览器控制台
陷阱: flag 在 JavaScript 变量或 console.log 输出中。
| 系统 | 解法 |
|---|---|
| 全平台 | 浏览器 -> F12 或 Ctrl+Shift+I -> Console 标签,查看 console 输出;或 Sources 标签搜索 flag |
Cookie / LocalStorage
陷阱: flag 隐藏在 Cookie 或 LocalStorage 中。
| 系统 | 解法 |
|---|---|
| 全平台 | 浏览器 DevTools -> Application -> Cookies / LocalStorage |
| Linux | curl -v http://target.com 2>&1 | grep -i flag(查看 Set-Cookie) |
HTTP 响应头
陷阱: flag 在 HTTP 响应头中(X-Flag, Flag 等自定义头)。
| 系统 | 解法 |
|---|---|
| Linux | curl -I http://target.com;或 curl -v http://target.com 2>&1 | grep -i flag |
| Windows | PowerShell: Invoke-WebRequest -Uri http://target.com | select Headers |
| macOS | 同 Linux |
四、图片隐写类
strings 命令
陷阱: flag 被嵌入图片文件的元数据或尾部,肉眼无法直接看到。
| 系统 | 解法 |
|---|---|
| Linux | strings flag.png | grep -i flag |
| Windows | findstr /i flag flag.png(或安装 Cygwin/Git Bash 使用 strings) |
| macOS | 同 Linux: strings flag.png | grep -i flag |
exiftool (元数据)
陷阱: flag 藏在图片的 EXIF 信息(作者、注释、描述等字段)中。
| 系统 | 解法 |
|---|---|
| Linux | exiftool flag.png | grep -i flag |
| Windows | 安装 exiftool 后同上;或右键 -> 属性 -> 详细信息 |
| macOS | 同 Linux |
binwalk / foremost (文件隐藏)
陷阱: 一张图片里隐藏了另一个文件(zip/rar/txt),需分离。
| 系统 | 解法 |
|---|---|
| Linux | binwalk -e flag.png 或 foremost flag.png |
| Windows | 安装 binwalk(WSL)或使用在线工具;或手动用 WinRAR/7-Zip 打开图片 |
| macOS | 同 Linux(brew install binwalk) |
二维码
陷阱: flag 被编码为二维码,肉眼无法直接读出。
| 系统 | 解法 |
|---|---|
| Linux | zbarimg qr.png(需安装 zbar-tools) |
| Windows | 手机扫码;或安装 zbar |
| macOS | 同 Linux(brew install zbar) |
图片拼接/分割
陷阱: flag 被分割成多个图片块,需要拼合或按特定顺序排列。
| 系统 | 解法 |
|---|---|
| 全平台 | 使用 ImageMagick: montage *.png -tile 4x1 -geometry +0+0 result.png;或用 Photoshop / GIMP 手动拼接 |
五、压缩包类
伪加密
陷阱: 压缩包可以解压但提示需密码,实际是伪加密(zip 的加密标志位被置位但未实际加密)。
| 系统 | 解法 |
|---|---|
| Linux | zip -F flag.zip --out fixed.zip && unzip fixed.zip |
| Windows | 使用 7-Zip -> 打开压缩包;或用 ZipCenOp: java -jar ZipCenOp.jar r flag.zip |
| macOS | 同 Linux |
暴力破解密码
陷阱: 压缩包有密码但密码简单(生日、电话、弱口令)。
| 系统 | 解法 |
|---|---|
| Linux | fcrackzip -b -c1 -l 1-8 -u flag.zip(爆破) |
| Windows | 使用 ZiGewe、Advanced Archive Password Recovery 等图形工具 |
| macOS | 同 Linux(brew install fcrackzip) |
明文攻击
陷阱: 压缩包里包含一个你知道内容的已知文件,可用已知明文攻击破解。
| 系统 | 解法 |
|---|---|
| Linux | pkcrack -C flag.zip -c known.txt -P known.zip -p known.txt -d decrypted.zip |
| Windows | 需 WSL 运行 pkcrack |
| macOS | 同 Linux(brew install pkcrack) |
六、流量分析类
Wireshark 过滤
陷阱: flag 藏在网络流量抓包(pcap/pcapng)中,需过滤定位。
通用解法:
| 系统 | 解法 |
|---|---|
| Linux | tshark -r capture.pcap -Y "http" -T fields -e http.request.uri | grep flag 或 strings capture.pcap | grep -i flag |
| Windows | 安装 Wireshark -> 打开 .pcap -> 过滤 http contains "flag" |
| macOS | 同 Linux |
常见过滤规则:
- HTTP:
http contains "flag" - TCP 追踪: 右键 -> Follow -> TCP Stream
- 搜索字符串:
strings capture.pcap | grep -i 'flag\|ctf' - USB 流量:
usbhid.data字段中包含键盘按键记录
base64 流量
陷阱: flag 被 base64 编码后通过 HTTP POST 请求发送。
| 系统 | 解法 |
|---|---|
| Linux | tshark -r capture.pcap -Y "http.request" -T fields -e http.file_data | base64 -d 2>/dev/null |
| Windows | Wireshark -> 找到 POST 包 -> Follow HTTP Stream -> 手动复制 base64 后解码 |
七、逆向工程类
直接 strings 查看
陷阱: flag 硬编码在 ELF/PE 文件字符串表中。
| 系统 | 解法 |
|---|---|
| Linux | strings flag.elf | grep -i flag;或 strings flag.elf | grep -E '[A-Za-z0-9_{}]{10,}' |
| Windows | 用 strings.exe(Sysinternals)或 IDA / Ghidra 搜索字符串 |
| macOS | 同 Linux |
文件类型混淆
陷阱: 文件无扩展名,直接运行提示格式错误。
| 系统 | 解法 |
|---|---|
| Linux | file flag -> 根据结果选择方式;若是 ELF -> chmod +x flag && ./flag 或静态分析 |
| Windows | file(通过 Git Bash);或用 Detect It Easy (DIE) |
| macOS | 同 Linux |
简单 XOR / 简单运算
陷阱: flag 被简单 XOR 加密后给出,需知道 key。
| 系统 | 解法 |
|---|---|
| 全平台 | Python: bytes([c ^ key for c in data]);key 通常为单字节 0x00-0xFF 或常见字符串如 "flag" |
八、音频类
频谱图隐藏
陷阱: flag 以文字形式隐藏在音频频谱图中。
| 系统 | 解法 |
|---|---|
| Windows | 使用 Audacity -> 打开音频 -> 视图 -> 频谱图 |
| Linux | audacity flag.wav -> 同上 |
| macOS | 同 Linux |
摩斯码隐藏在音频中
陷阱: 音频中有规律的嘀嗒声,编码了摩斯电码。
| 系统 | 解法 |
|---|---|
| 全平台 | Audacity 放大波形 -> 手动解读(长 = -, 短 = .);或用工具 morse2ascii |
九、杂项
进制转换
陷阱: flag 以二进制 / 八进制形式给出。
# 二进制转字符串
bs = "01000110011011000110000101100111"
''.join(chr(int(bs[i:i+8],2)) for i in range(0,len(bs),8))| 系统 | 解法 |
|---|---|
| 全平台 | Python 脚本;或在线转换 |
时间戳陷阱
陷阱: flag 隐藏在一串看似无意义的数字中,实际是 Unix 时间戳或汉字 Unicode。
# 时间戳转字符串
import time; time.ctime(1744876800)像素值提取
陷阱: flag 隐藏在图片的像素 RGB 值中(最低有效位 LSB 隐写)。
| 系统 | 解法 |
|---|---|
| 全平台 | 使用 zsteg(Linux/macOS: gem install zsteg);或 Python PIL 逐像素提取最低位 |
代码审计
陷阱: 题目给出一段代码,flag 是代码在特定输入下的输出结果。
| 系统 | 解法 |
|---|---|
| 全平台 | 阅读代码逻辑,用纸笔计算或本地运行代码得出结果 |
十、通用工具推荐
Linux 环境(推荐比赛使用)
sudo apt install binwalk exiftool foremost steghide zbar-tools libsixel-bin \
fcrackzip pkcrack tshark audacity
# 以下可通过 pip 安装
pip install zsteg pycryptodome
Windows 环境
WSL(推荐):安装 Ubuntu WSL 后执行上述 Linux 命令
或下载图形工具:
- 010 Editor(十六进制查看)
- Detect It Easy(文件类型识别)
- WinHex
- Wireshark
- 7-Zip
- HxD(十六进制编辑器)
macOS 环境
brew install binwalk exiftool foremost zbar libsixel fcrackzip tshark audacity zsteg
实战建议
- 先跑 strings + file — 这两步能解决 70% 的签到题。
- 用
grep -i 'flag\|ctf\|{'— 不论哪种类型的题目,先全局搜索 flag 字样。 - 微信/QQ 截图 OCR — 如果 flag 以图片文字展示,截图后用 OCR 提取文字。
- 保持冷静 — 签到题往往是最简单的,如果五分钟还没思路,试着换个题目类型。
- 关注题目附件名 — 文件名、扩展名、文件大小都是线索。
- 留意题目标题与描述 — 有时题目标题就暗示了解法(如”Base Guys” -> Base64)。