SKILL.md
readonly只读
name
solve-challenge
description
通过执行初步分类、识别主要类别,并将执行路由到正确的专用 ctf-* 技能来解决 CTF 挑战。当用户提供挑战包、远程服务、可疑文件或仅模糊的挑战描述,且你必须确定从何处开始时使用。当类别已明确且可以直接调用专用技能时不要使用;这是调度和侦察入口点,不是类别特定技术的最深层参考。
CTF 挑战求解器
你是一名熟练的 CTF 玩家。你的目标是解决挑战并找到 flag。
环境设置
根据你的工作流程有两种设置策略:
预安装(推荐在比赛前)
使用中央安装入口点:
bash scripts/install_ctf_tools.sh all
当你只需要一个工具组时,运行更窄的模式:
bash scripts/install_ctf_tools.sh python
bash scripts/install_ctf_tools.sh apt
bash scripts/install_ctf_tools.sh brew
bash scripts/install_ctf_tools.sh gems
bash scripts/install_ctf_tools.sh go
bash scripts/install_ctf_tools.sh manual
完整的包列表现在位于 scripts/install_ctf_tools.sh。
按需安装(挑战期间)
每个类别技能的 SKILL.md 都有一个先决条件部分,仅列出该类别所需的工具。边用边安装。
工作流程
步骤 0:CTFd 平台检测
如果已知 CTF 平台 URL,检查它是否运行 CTFd 并切换到 API 驱动的导航:
# 检测 CTFd(查找 /api/v1/ 和 /themes/core/)
curl -s "$CTF_URL/api/v1/" | head -5
curl -s "$CTF_URL" | grep -oE '/themes/core/'
如果检测到 CTFd,询问用户他们的 API 令牌(从 CTFd 设置 > 访问令牌生成)。默认不提供令牌——用户必须先在 CTFd Web UI 中创建一个。提供后,设置环境变量并通过 API 继续:
export CTF_URL="https://ctf.example.com"
export CTF_TOKEN="ctfd_..." # 询问用户获取
调用 /ctf-misc 并加载其 ctfd-navigation.md 以获取完整的 API 参考和 Python 客户端类。
步骤 1:侦察
- 探索文件 -- 列出挑战目录,对所有内容运行
file * - 分类二进制文件 -- 对二进制文件运行
strings、xxd | head、binwalk、checksec - 获取链接 -- 如果挑战提到 URL,首先获取它们以了解上下文
- 连接 -- 尝试远程服务(
nc)以了解它们期望什么 - 阅读提示 -- 挑战描述、文件名和注释通常包含线索
步骤 2:分类
确定主要类别,然后调用匹配的技能。
按文件类型:
.pcap、.pcapng、.evtx、.raw、.dd、.E01-> 取证.elf、.exe、.so、.dll、无扩展名的二进制文件 -> 逆向或 pwn(检查是否提供了远程服务——如果是,很可能是 pwn).py、.sage、带数字的.txt-> 密码学.apk、.wasm、.pyc-> 逆向- Web URL 或包含 HTML/JS/PHP/模板的源代码 -> Web
- 图像、音频、无明显内容的 PDF -> 取证(隐写术)
按挑战描述关键词:
- "buffer overflow"、"ROP"、"shellcode"、"libc"、"heap" -> pwn
- "RSA"、"AES"、"cipher"、"encrypt"、"prime"、"modulus"、"lattice"、"LWE"、"GCM" -> 密码学
- "XSS"、"SQL"、"injection"、"cookie"、"JWT"、"SSRF" -> Web
- "disk image"、"memory dump"、"packet capture"、"registry"、"power trace"、"side-channel"、"spectrogram"、"audio tracks"、"MKV" -> 取证
- "find"、"locate"、"identify"、"who"、"where" -> OSINT
- "obfuscated"、"packed"、"C2"、"malware"、"beacon" -> 恶意软件
- "jail"、"sandbox"、"escape"、"encoding"、"signal"、"game"、"Nim"、"commitment"、"Gray code" -> 杂项
按服务行为:
- 端口有交互式提示,长输入崩溃 -> pwn
- HTTP 服务 -> Web
- netcat 有数学/密码学谜题 -> 密码学
- netcat 有受限 shell 或 eval -> 杂项(jail)
步骤 3:调用类别技能
一旦你识别出类别,调用匹配的技能以获取专门技术:
| 类别 | 调用 | 何时使用 |
|---|---|---|
| Web | /ctf-web |
XSS、SQLi、SSTI、SSRF、JWT、文件上传、原型污染 |
| Pwn | /ctf-pwn |
缓冲区溢出、格式化字符串、堆、ROP、沙箱逃逸 |
| 密码学 | /ctf-crypto |
RSA、AES、ECC、PRNG、ZKP、经典密码 |
| 逆向 | /ctf-reverse |
二进制分析、游戏客户端、虚拟机、混淆代码 |
| 取证 | /ctf-forensics |
磁盘镜像、内存转储、事件日志、隐写、网络捕获 |
| OSINT | /ctf-osint |
社交媒体、地理定位、DNS、公共记录 |
| 恶意软件 | /ctf-malware |
混淆脚本、C2 流量、PE/.NET 分析 |
| 杂项 | /ctf-misc |
Jails、编码、RF/SDR、深奥语言、约束求解 |
你也可以调用 /ctf-<category> 来加载包含详细技术的完整技能说明。
步骤 4:卡住时转向
如果第一种方法不起作用:
- 重新审视假设 -- 这真的是你认为的类别吗?一个“Web”挑战可能需要密码学来进行 JWT 伪造。一个“取证”PCAP 可能包含一个需要重放的 pwn 漏洞。
- 尝试不同的类别技能 -- 许多挑战跨越多个类别。调用第二个技能来处理跨领域技术。
- 寻找遗漏的东西 -- 隐藏文件、备用端口、响应头、源代码中的注释、图像中的元数据。
- 简化 -- 如果漏洞利用太复杂,检查是否有更简单的路径(默认凭据、已知 CVE、逻辑错误)。
- 检查边界情况 -- 差一错误、竞争条件、整数溢出、编码不匹配。
常见的多类别模式:
- 取证 + 密码学:PCAP/磁盘镜像中的加密数据,需要密码学解密
- Web + 逆向:Web 挑战中的 WASM 或混淆 JS
- Web + 密码学:JWT 伪造、自定义 MAC/签名方案
- 逆向 + Pwn:先逆向二进制文件,然后利用漏洞
- 取证 + OSINT:从转储中恢复数据,然后通过公共来源追踪
- 杂项 + 密码学:jail 逃逸需要在约束下构建密码学原语
- OSINT + 隐写:社交媒体帖子中的 Unicode 同形异义词隐写(西里尔字母相似物编码比特)
- Web + 取证:付费墙绕过(curl 揭示被 CSS 覆盖隐藏的内容)
- 杂项 + 密码学 + 博弈论:多阶段交互式挑战,包含 AES 解密 → HMAC 承诺 → 组合博弈求解(GF(256) Nim)
- 密码学 + 几何 + 格:多层挑战,从空间重建 → 子空间恢复 → LWE 求解 → AES-GCM 解密逐步推进
- 取证 + 信号处理:功率迹 / 侧信道分析,需要对测量数据进行统计分析
- 取证 + 网络 + 编码:PCAP 中基于时间的编码(数据包间间隔编码二进制数据)
步骤 5:生成 Write-up
解决挑战后,调用 /ctf-writeup 生成标准化的提交式 writeup——简洁、可重现,并准备好供比赛组织者或队友验证。
Flag 格式
Flag 因 CTF 而异。常见格式:
flag{...}、FLAG{...}、CTF{...}、TEAM{...}- 自定义前缀:检查挑战描述或 CTF 规则以获取格式(例如
ENO{...}、HTB{...}、picoCTF{...}) - 有时只是没有包装的纯文本字符串
验证规则(重要):
- 如果你找到多个类似 flag 的字符串,将它们视为候选,并在最终确定前进行验证。
- 优先选择与预期工件/工作流相关的令牌(而不是随机元数据噪声或明显的诱饵)。
- 进行全语料库唯一性检查,并在报告时包含源文件/路径。
# 在文件中搜索常见 flag 模式
grep -rniE '(flag|ctf|eno|htb|pico)\{' .
# 在二进制/内存输出中搜索
strings output.bin | grep -iE '\{.*\}'
快速参考
# 侦察
file * # 识别文件类型
strings binary | grep -i flag # 快速字符串搜索
xxd binary | head -20 # 十六进制转储头部
binwalk -e firmware.bin # 提取嵌入文件
checksec --file=binary # 检查二进制保护
# 连接
nc host port # 连接到挑战
echo -e "answer1\nanswer2" | nc host port # 脚本化输入
curl -v http://host:port/ # HTTP 侦察
# Python 漏洞利用模板
python3 -c "
from pwn import *
r = remote('host', port)
r.interactive()
"
挑战
$ARGUMENTS






