签到题

签到题,顾名思义,就是用来签到的题目,简单到甚至不需要思考就可以做出来。

实际上,你并不需要真的把签到题作为签到——没有规定说明只有做过签到题才算开始比赛。你可以优先去做高难题,拿下前三血。

不过,作为新手,签到题是为数不多的拿分项目了,CTF 普遍要难于其他计算机相关竞赛。

签到题不会放在固定的题目位置,你需要自己判别哪一道题目是签到题。

有的时候主办方会在题干里告诉你这是签到题,甚至告诉你这题的解法,相当于把答案告诉你了。


一、文件转换类

主办方可能会将图片、二进制文件等直接以 .txt 形式给出。直接查看会因格式不匹配而看到一团乱码。

陷阱: 文件扩展名不可信。需要判断文件原始格式。

判断原始格式

系统方法
Windows右键 -> 属性(查看”类型”或”以前版本”);或用 file 命令(需安装 Git Bash / WSL)
Linuxfile flag.txt
macOSfile flag.txt

PNG -> TXT 恢复

陷阱: flag 隐藏在转换后的图片中,直接 cat 看到乱码。

系统解法
Linuxcat 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 恢复

系统解法
Linuxcp flag.txt flag.jpg && xdg-open flag.jpg
Windows复制文件 -> 改后缀为 .jpg -> 打开
macOS同 Linux,open flag.jpg

二进制文件被转为 hex dump

陷阱: 文件内容由十六进制文本表示,直接 cat 看到 hex 字符串而非二进制。

系统解法
Linuxxxd -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 的倍数。

系统解法
Linuxecho "base64string" | base64 -d;或 cat flag.txt | base64 -d
WindowsPowerShell: [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)。

系统解法
Linuxbase32 -d flag.txtxxd -r -p flag.txt(即 hex)
Windows在线工具;或 Python: import base64; base64.b32decode("...")
macOS同 Linux

ROT13 / 凯撒密码

陷阱: flag 看起来像乱序字母,实际是字母移位加密。

ROT13 特征:字母范围 A-Za-z,每个字符向后移 13 位(ROT13 是可逆的,再应用一次即还原)。

系统解法
Linuxecho "synt{...}" | tr 'A-Za-z' 'N-ZA-Mn-za-m'
WindowsPowerShell: -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 / 自写映射表
Linuxapt install morse -> morse -d flag.txt

三、网页类签到

查看页面源代码

陷阱: flag 直接藏在 HTML 注释中。

系统解法
Windows浏览器 -> Ctrl+U(查看源代码)
Linuxcurl -s http://target.com | grep -i flag
macOS同 Linux

浏览器控制台

陷阱: flag 在 JavaScript 变量或 console.log 输出中。

系统解法
全平台浏览器 -> F12Ctrl+Shift+I -> Console 标签,查看 console 输出;或 Sources 标签搜索 flag

陷阱: flag 隐藏在 Cookie 或 LocalStorage 中。

系统解法
全平台浏览器 DevTools -> Application -> Cookies / LocalStorage
Linuxcurl -v http://target.com 2>&1 | grep -i flag(查看 Set-Cookie)

HTTP 响应头

陷阱: flag 在 HTTP 响应头中(X-Flag, Flag 等自定义头)。

系统解法
Linuxcurl -I http://target.com;或 curl -v http://target.com 2>&1 | grep -i flag
WindowsPowerShell: Invoke-WebRequest -Uri http://target.com | select Headers
macOS同 Linux

四、图片隐写类

strings 命令

陷阱: flag 被嵌入图片文件的元数据或尾部,肉眼无法直接看到。

系统解法
Linuxstrings flag.png | grep -i flag
Windowsfindstr /i flag flag.png(或安装 Cygwin/Git Bash 使用 strings)
macOS同 Linux: strings flag.png | grep -i flag

exiftool (元数据)

陷阱: flag 藏在图片的 EXIF 信息(作者、注释、描述等字段)中。

系统解法
Linuxexiftool flag.png | grep -i flag
Windows安装 exiftool 后同上;或右键 -> 属性 -> 详细信息
macOS同 Linux

binwalk / foremost (文件隐藏)

陷阱: 一张图片里隐藏了另一个文件(zip/rar/txt),需分离。

系统解法
Linuxbinwalk -e flag.pngforemost flag.png
Windows安装 binwalk(WSL)或使用在线工具;或手动用 WinRAR/7-Zip 打开图片
macOS同 Linux(brew install binwalk)

二维码

陷阱: flag 被编码为二维码,肉眼无法直接读出。

系统解法
Linuxzbarimg 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 的加密标志位被置位但未实际加密)。

系统解法
Linuxzip -F flag.zip --out fixed.zip && unzip fixed.zip
Windows使用 7-Zip -> 打开压缩包;或用 ZipCenOp: java -jar ZipCenOp.jar r flag.zip
macOS同 Linux

暴力破解密码

陷阱: 压缩包有密码但密码简单(生日、电话、弱口令)。

系统解法
Linuxfcrackzip -b -c1 -l 1-8 -u flag.zip(爆破)
Windows使用 ZiGewe、Advanced Archive Password Recovery 等图形工具
macOS同 Linux(brew install fcrackzip)

明文攻击

陷阱: 压缩包里包含一个你知道内容的已知文件,可用已知明文攻击破解。

系统解法
Linuxpkcrack -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)中,需过滤定位。

通用解法:

系统解法
Linuxtshark -r capture.pcap -Y "http" -T fields -e http.request.uri | grep flagstrings 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 请求发送。

系统解法
Linuxtshark -r capture.pcap -Y "http.request" -T fields -e http.file_data | base64 -d 2>/dev/null
WindowsWireshark -> 找到 POST 包 -> Follow HTTP Stream -> 手动复制 base64 后解码

七、逆向工程类

直接 strings 查看

陷阱: flag 硬编码在 ELF/PE 文件字符串表中。

系统解法
Linuxstrings flag.elf | grep -i flag;或 strings flag.elf | grep -E '[A-Za-z0-9_{}]{10,}'
Windowsstrings.exe(Sysinternals)或 IDA / Ghidra 搜索字符串
macOS同 Linux

文件类型混淆

陷阱: 文件无扩展名,直接运行提示格式错误。

系统解法
Linuxfile flag -> 根据结果选择方式;若是 ELF -> chmod +x flag && ./flag 或静态分析
Windowsfile(通过 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 -> 打开音频 -> 视图 -> 频谱图
Linuxaudacity 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

实战建议

  1. 先跑 strings + file — 这两步能解决 70% 的签到题。
  2. grep -i 'flag\|ctf\|{' — 不论哪种类型的题目,先全局搜索 flag 字样。
  3. 微信/QQ 截图 OCR — 如果 flag 以图片文字展示,截图后用 OCR 提取文字。
  4. 保持冷静 — 签到题往往是最简单的,如果五分钟还没思路,试着换个题目类型。
  5. 关注题目附件名 — 文件名、扩展名、文件大小都是线索。
  6. 留意题目标题与描述 — 有时题目标题就暗示了解法(如”Base Guys” -> Base64)。