这个项目把 CrewAI 模板改造成了一个密码学 CTF 出题 Agent。
本项目的核心机制不是“让大模型一次性直接出题”,而是把出题过程拆成一个可验收的多阶段工作流:challenge_designer 负责根据 flag 和需求文档生成题目与公开附件,writeup_reproducer 仅基于公开题包独立复现解题过程,validator_reviewer 再对题面、writeup 和恢复出的 flag 做最终审核。三者由 review_flow.py 中的 Flow 统一调度,失败时会根据原因选择“整轮重写”或“仅重做解题阶段”,以降低大模型幻觉导致的假题、错题和不可复现问题。
项目的另一个特点是把“提示词约束”和“代码硬校验”结合在一起。运行时会创建 author_workspace、challenge_workspace、solver_workspace 三个隔离工作区,并通过 Docker 中的代码解释器/Bash 工具限制不同 Agent 只能访问各自允许的目录,避免解题 Agent 直接读取出题私有材料。与此同时,quality_checks.py 会对公开区是否泄露明文 flag、题面是否真正落盘、创意基线是否过低、recovered_flag.txt 是否与目标 flag 完全一致等关键条件进行硬编码校验。也就是说,这个项目真正依赖的是“可执行、可验证、可回退”的机制设计,而不只是提示词本身。
运行时仅保留少量命令行参数:
--flag:目标 flag(必填,格式必须是flag{...})--brief-md:Markdown 需求文档路径(默认challenge_brief.md)--output-root:输出根目录(默认outputs)--plot-flow:是否输出 Flow 可视化图
除 flag 外的业务需求(题型、难度、提示、创意强度等)统一写在 challenge_brief.md 的自由文本中,不要求固定字段格式。
运行后会在 outputs/ 下自动创建唯一目录(例如 outputs/run_20260319_153012_a1b2c3d4/),避免重名。
该目录内会产生:
challenge.md:题目说明、密文或加密文件信息、提示、出题备注writeup.md:完整解题 writeup,要求可执行且可复现- 题目附件(密文/加密文件)
- 复现环境文件(默认要求 Python + uv,例如
pyproject.toml、README-repro.md、解题脚本)
任务配置要求 Agent 使用代码解释器执行和验证流程,确保最终可复现到输入的 flag。
python src/CTF-agent/main.py \
--flag "flag{Gzl1-Su33ess}" \
--brief-md challenge_brief.md \
--output-root outputs运行结束后,终端会打印本次唯一输出目录路径。
你需要在环境中安装 CrewAI 相关依赖后再运行。若看到 ModuleNotFoundError: No module named 'crewai',先安装 crewai 和 crewai-tools。
推荐使用 uv 管理项目环境:
uv sync
uv run python src/CTF-agent/main.py --flag "flag{example_test_flag}" --brief-md challenge_brief.md- 直接用自然语言写需求,不要求固定格式。
- 运行命令时通过
--brief-md指定文件路径(默认就是challenge_brief.md)。 flag仍通过命令行参数--flag传入,且格式必须为flag{...}。