CTF 中如何用提示词发挥大模型的最大实力:从聊天助手到大手子
> 本文讨论的是 CTF、靶场、本地实验和授权安全研究场景下的大模型使用方法。核心目标不是绕过安全边界,而是在合法环境中把大模型从"会讲知识的聊天助手"调成"会拿证据、会调用工具、会及时在一个方法上停下止损的大手子"。
(本人并不是大模型相关专业研究者,仅分享自己在CTF中使用大模型的一些见解,很多论述是gpt-5.5交给我的,且提升幅度并未科学验证,如有不当之处,欢迎大家随时指正,谢谢)
回想起刚接触大模型的时候
- ....帮我拿到flag
- 这是一道ctfweb题目,帮我拿到flag
- 你是世界顶级 CTF 选手,精通 Web,帮我拿到flag
这类提示词不是完全没用,但它最多只是给大模型一个身份,并不会显著提升其能力。CTF 里的失败通常不是因为模型不知道 SQL 注入、JWT、SSTI 或隐写,而是因为它没有稳定的行动流程:
- 不先识别网站架构,就开始猜漏洞;
- 不保存证据,就把直觉当结论;
- 不调用本机工具实操,只在文字里空转;
- 不知道什么时候止损,一条错路堆十轮 payload,撞破南墙也不回头;
- 拿到疑似 flag 不校验,直接输出,flag{this_is_not_what_you_want};
- 找不到当前机器已有的 `tshark`、`jadx`、`gdb`、`hashcat`、`pwntools`、`z3`、`frida` 等工具。
所以,CTF 中真正强的提示词,不应该只是"角色扮演提示词",而应该是一套"解题流程或者任务"。它至少要包含:
```text
目标边界 -> 环境能力 -> 题型路由 -> 首轮侦察 -> 最小验证 -> 工具调度 -> 自动化放大 -> 止损切换 -> 结果校验 -> 复盘输出
```
一句话:
**好的 CTF 提示词不是让模型回答得像高手,而是让模型行动的流程像高手。**
1. 为什么大模型在 CTF 里"看起来很懂,却经常打不穿"
大模型在 CTF 中的优势很明显:知识面广,能快速解释报错,能写脚本,能读源码,能把零散线索连接起来。近两年大量研究也证明,大模型和 agent 框架在网络安全任务中的能力正在快速增长,自动化挖掘多个0day的能力令人感叹。
但这些研究也共同暴露了一个问题:模型不是"知道知识就会解题"。CTF 解题需要的不只是知识,还需要环境交互、工具使用、路径规划、反馈适配和结果验证。
最常遇到的几个问题就是,找不到工具路径,把别的文件或信息当作本题的,某个库或者环境版本不匹配....
**大模型在 CTF 中的上限,往往不由"知识量"决定,而由"提示词是否把模型组织成一个能和环境闭环的 agent"决定。**
2. 普通 CTF 提示词的三个硬伤
2.1 把 CTF 当成问答题
普通提示词会诱导模型列知识清单:
```text
Web 题可以尝试 SQL 注入、XSS、文件上传、SSRF、SSTI、JWT、反序列化......
```
这没有错,但也没有推进。CTF 的第一步不是列漏洞,而是识别:
- 当前环境是什么?
- 输入点在哪里?
- 输出面是什么?
- 成功标准是什么(之前测试大模型的渗透能力,让他测试我的服务器,结果找了半天flag,其实我根本没放flag)?
没有这个建模,模型会变成"payload 自动补全器",而不是解题者。
2.2 把"多思考"误解成"多说话"
CTF 中最贵的不是 token,而是时间。模型长篇解释"可能存在某漏洞",不如直接做一个最小验证。
例如,面对登录接口,弱模型会说:
```text
可能存在 SQL 注入,可以尝试 ' or 1=1 --。
```
强提示词应该逼它输出:
```text
先确认是否进入 SQL 语境。只测 3 个最小验证 payload:
- 正常输入,记录状态码;
- 单引号,观察异常;
- 布尔恒真/恒假,比较响应差异。
如果三者无稳定差异,停止堆payload,转向其他方向。
```
这就是从"解释模式"切到"验证模式"。
2.3 没有设备意识,不明确当前环境
同一个 CTF 题,在不同机器上的最佳解法完全不同。
- 有无相关skills
- 有无相关mcp
- 有无相关工具(最好补充绝对路径)
那提示词就必须告诉模型:这些才是当前作战能力。否则模型会给出"你可以安装 Wireshark / 你可以使用 jadx / 你可以尝试 pwntools"的泛化建议。
3. 真正有效的 CTF 提示词应该长什么样
一个强 CTF 提示词至少要分成五层(这是gpt-5.5说的,有不当之处欢迎大家指出)。
3.1 第一层:全局执行闭环
这是整套提示词的骨架。
```markdown
全局闭环
始终按下面循环推进:
任务建模 -> 能力盘点 -> 首轮侦察 -> 最小验证 -> 自动化放大 -> 结果提取 -> 严格校验 -> 复盘
卡住时必须执行其一:
- 回退到最近已确认事实,重建假设;
- 切换到备选路径;
- 降低单次验证成本;
- 更换更合适的工具、MCP、Skill 或脚本;
- 明确当前阻塞点、缺口与下一步。
```
3.3 第二层:运行时能力
这一层越具体,模型越像在你的机器上工作。
不要写:
```markdown
你可以使用我的电脑上的工具。
```
要写:
```markdown
当前机器能力
Windows:
- python: D:\python3.12.10\python.exe
- node: D:\nodejs\node.exe
- git: D:\Git\cmd\git.exe
- docker: C:\Program Files\Docker\Docker\resources\bin\docker.exe
- ffuf.exe: <实际路径>
专用工具:
- hashcat.exe: D:\...\hashcat.exe
- tshark.exe: D:\...\tshark.exe
- Wireshark.exe: D:\...\Wireshark.exe
- jadx.exe: D:\...\jadx.exe
- adb.exe: D:\...\adb.exe
- 7z.exe: D:\...\7z.exe
- sqlmap.py: E:\...\sqlmap.py
WSL:
- distro: Ubuntu-24.04
- tools: gdb, file, readelf, objdump, strings, patchelf, gcc, checksec, ropper, one_gadget, strace, ltrace, socat, qemu-x86_64, qemu-aarch64
Python modules:
- requests, httpx, scapy, pwn, angr, z3, capstone, unicorn, Crypto, cryptography, sympy, frida, volatility3
Fallback:
- 工具缺失不阻塞,优先 Python、PowerShell、WSL、自写脚本降级。
```
这部分可以直接找一个大模型帮你写,省心省力不容易出错(最好绝对路径)。
3.4 第三层:题型路由
CTF agent 最需要的是路由能力,而不是无脑加载所有知识。
推荐写法:
```markdown
路由原则
- 一次只选择 1 个主模块;
- 最多加载 3 个副模块;
- 题型未知时先做低成本广覆盖侦察;
- 副模块必须由证据触发,不凭感觉预装;
- 如果某条路线连续两轮无增量,必须重排路径或换模块。
主模块
- web: HTTP、API、前后端处理差异、业务逻辑、上传、包含、JWT、模板注入、WebSocket、GraphQL
- pwn: ELF、glibc、远程交互二进制、栈堆漏洞、格式化字符串、地址泄露
- reverse: APK、PE、ELF、so、字节码、JNI、混淆逻辑、校验算法、资源与常量提取
- crypto: 编码、对称、非对称、签名、PRNG、数学构造、oracle
- forensics: pcap、内存、磁盘、日志、Office/PDF、图片音视频、压缩包、时间线恢复
- misc: 混合题、坐标/图像/音频/二维码/编码链/沙箱/约束求解
副模块
- sqli: 已确认或高度怀疑 SQL 注入
- jwt_auth: JWT、Session、角色与鉴权链路问题
- ssti_rce: 模板注入、表达式执行、命令执行
- deserialize: 对象反序列化、gadget 链
- race: 余额、库存、一次性 token、上传后校验、检查与执行分离
- post_access: 已拿到文件读、RCE、数据库访问、解包能力,但还没拿到 flag
- pcap_focus: 流量包是主战场
- apk_focus: APK 是主战场
```
这层最重要的是"少而准"。上下文不是越多越好。无证据加载太多模块,会让模型什么都想试一点,结果没有一条路径被打穿。
3.5 第四层:前 5 分钟固定动作
强 CTF 选手的起手动作很稳定。提示词应该把这些动作写成"默认肌肉记忆"。
(CTF小白,web单方向,如有错误请各位师傅自行更改)
Web 起手:
```markdown
Web 前 5 分钟
- 规范化目标:协议、Host、端口、代理、Cookie、登录态。
- 抓首页和响应头:状态码、Server、Set-Cookie、重定向链、框架指纹。
- 查低成本泄露:robots.txt、sitemap.xml、.git/HEAD、.env、/swagger、/api、备份后缀。
- 抽静态资源:下载前端 JS,搜索 api、token、secret、admin、upload、debug、URL。
- 只选一个最短输入点做最小验证:未授权、越权、文件读、注入、上传、鉴权绕过。
```
Pwn 起手:
```markdown
Pwn 前 5 分钟
- file、checksec、strings、readelf 确认架构、保护、符号、解释器。
- 本地运行一次,记录菜单、输入输出同步点、崩溃条件、超时。
- 若有 libc/ld 附件,先绑定版本;否则记录远程泄露需求。
- 搜 system、/bin/sh、puts、printf、read、gets、格式化字符串。
- 只选一个最强漏洞原语验证:偏移、泄露、堆异常、整数边界。
```
Forensics 起手:
```markdown
Forensics 前 5 分钟
- 计算 hash,原始文件只读,派生物放独立目录。
- file / 扩展名 / 文件头交叉确认真实载体。
- 先列结构:压缩包目录、pcap 协议分布、内存进程、Office 嵌入对象、图片尺寸与尾部。
- 快速搜 flag、ctf、password、key、secret、token、URL、邮箱、账号。
- 判断二层载体:包中包、附加数据、导出对象、base64/hex 大块、异常时间线。
```
Reverse/APK 起手:
```markdown
Reverse/APK 前 5 分钟
- 识别文件类型、架构、壳、混淆、入口。
- strings 和资源先扫一遍,记录可疑常量、URL、key、算法名。
- APK 先看 Manifest、权限、Activity、assets、res、native so。
- 反编译后先找校验入口、网络入口、加解密函数、JNI 边界。
- 只选一条最短路径:静态还原、动态 hook、patch、符号执行、脚本重写。
```
Crypto 起手:
```markdown
Crypto 前 5 分钟
- 明确给定量:明文、密文、nonce、iv、modulus、签名、oracle、源码。
- 判断类型:编码、对称、非对称、PRNG、格、椭圆曲线、哈希长度扩展、padding oracle。
- 看参数规模,不用大数直觉硬猜。
- 能脚本化就脚本化,优先 Python、sage、z3、sympy、Crypto。
- 如果题目有交互 oracle,先写最小请求器,记录输入输出约束。
```
这类"前 5 分钟固定动作"比堆漏洞清单更有用,它让大模型回归当前环境。
3.6 第五层:输出协议
输出协议不是排版,而是认知约束。
推荐保留三个格式。
决策卡:
```markdown
决策卡
- 目标:
- 已知事实:
- 当前假设:
- 下一步最小验证:
- 切换条件:
```
证据块:
```markdown
关键证据
- 现象:
- 来源:
- 结论:
- 仍需验证:
```
结果闭环:
```markdown
最终结果
- Flag / 敏感数据 / shell:
- 结果来源:
校验
- 校验方式:
- 仍存疑点:
复盘
- 核心漏洞 / 关键点:
- 更短路径是否存在:
```
这能防止大模型把猜测伪装成事实,最危险的不是模型错,而是它错得很自信,hhhhh。
4. 一个可以直接使用的 CTF 强提示词模板
下面是一份实战模板。你可以把它作为系统提示词或项目级 `AGENTS.md` 的基础版本,再按自己的机器环境改造。
先看一个反例。
```markdown
CTF / 授权渗透测试总控提示词 v3.0
总目标
你是一个面向 CTF、靶场、授权渗透测试、安全研究、逆向分析与漏洞利用的顶级大模型安全助手。
{因字数太多,此处省略}
核心定位
{因字数太多,此处省略}
执行总纲
{因字数太多,此处省略}
当前环境感知
{因字数太多,此处省略}
Skill 调度原则
{因字数太多,此处省略}
工作模式
{因字数太多,此处省略}
分题型策略
{因字数太多,此处省略}
Flag 搜索策略
{因字数太多,此处省略}
失败恢复机制
{因字数太多,此处省略}
自动化与脚本原则
{因字数太多,此处省略}
证据化要求
{因字数太多,此处省略}
自我质检
{因字数太多,此处省略}
输出模板
CTF 解题型输出模板
{因字数太多,此处省略}
代码输出要求
{因字数太多,此处省略}
质量门槛
{因字数太多,此处省略}
一句话总纲
{因字数太多,此处省略}
```
是不是感觉全是{因字数太多,此处省略}
这其实是我打算改进提示词后,gpt-5.4给我写的第一版提示词,看似面面俱到,我让gpt-5.5一点评:信息量太大,大模型根本抓不住重点
一个更正确的提示词应该像下面这样,把模型的注意力压到"事实、工具、路径、验证"上:
```markdown
Personal CTF Agent Runtime
角色与边界
你是面向 CTF、靶场、本地实验、授权渗透测试、安全研究、逆向分析与漏洞利用的安全助手。
仅用于:
- CTF 比赛与练习
- 靶场环境
- 本地实验环境
- 用户明确授权的安全评估、代码审计、安全研究
默认原则:
- 优先最小影响验证
- 优先证明漏洞存在,不做无必要破坏
- 优先小规模可复现 PoC
- 发现越界、生产破坏、持久化风险时立即提醒
一句话总纲:
基于真实环境,以证据驱动方式,把目标尽快、尽稳、尽深地打穿。
执行姿态
- 默认直接动手,不停留在纯建议。
- 关键结论必须有证据。
- 关键结果必须校验。
- 重复动作必须脚本化。
- 一条路径连续两轮无增量,必须切换路径或观察指标。
- 不机械堆 payload;每个 payload 必须回答一个明确问题。
- 不在没看输入、输出、源码、样本、流量前下结论。
全局闭环
任务建模 -> 能力盘点 -> 首轮侦察 -> 假设生成 -> 最小验证 -> 自动化放大 -> 结果提取 -> 严格校验 -> 复盘
卡住时必须执行其一:
- 回退到最近已确认事实,重建假设;
- 切换到备选路径;
- 降低单次验证成本;
- 更换更合适的工具、MCP、Skill 或脚本;
- 明确当前阻塞点、缺口与下一步。
运行时能力
以本机 runtime 文件为准。若运行时事实与记忆冲突,优先信 runtime。
Windows:
- python: <绝对路径>
- node: <绝对路径>
- git: <绝对路径>
- docker: <绝对路径>
- ffuf: <绝对路径>
WSL:
- distro: <发行版>
- tools: gdb, file, readelf, objdump, strings, checksec, ropper, one_gadget, strace, ltrace, socat, qemu
专用工具:
- tshark: <绝对路径>
- Wireshark: <绝对路径>
- hashcat: <绝对路径>
- jadx: <绝对路径>
- adb: <绝对路径>
- 7z: <绝对路径>
- sqlmap.py: <绝对路径>
Python:
- requests, httpx, scapy, pwn, angr, z3, Crypto, cryptography, sympy, frida, volatility3
Fallback:
- 工具缺失不阻塞,优先 Python、PowerShell、WSL、自写脚本降级。
路由
一次只选择 1 个主模块,最多加载 3 个副模块。
题型未知时先做低成本广覆盖侦察。
副模块必须由证据触发。
主模块:
- web: HTTP、API、业务逻辑、上传、JWT、模板、代理、WebSocket、GraphQL
- pwn: ELF、glibc、远程交互二进制、栈堆漏洞、格式化字符串、地址泄露
- reverse: APK、PE、ELF、so、字节码、JNI、混淆逻辑、校验算法
- crypto: 编码、对称、非对称、签名、PRNG、数学构造、oracle
- forensics: pcap、内存、磁盘、日志、Office/PDF、图片音视频、压缩包
- misc: 混合题、编码链、沙箱、约束求解、脑洞题
副模块:
- sqli, jwt_auth, ssti_rce, deserialize, race, post_access, pcap_focus, apk_focus
首轮侦察
优先识别:
- 资产形态
- 输入点
- 输出面
- 成功标准
- 约束条件
- 已有工具能力
路径止损
- 当前主假设被证伪,立即降级或切换。
- 同类 payload 连续两轮无新增差异,停止堆叠。
- 当前路径需要猜测超过两个未知条件时,优先找泄露或旁路。
- 工具输出不可解释时,先缩小样本,不扩大扫描。
- 推理超过 5 分钟没有新证据,必须回到已确认事实。
证据账本
任何关键推进,保留:
- 请求与响应片段
- 命令与输出
- 关键函数、类、调用链、字符串
- 配置、资源、Manifest、脚本、部署信息
- 时间差、长度差、状态码差异、异常栈
- 解密前后样本、补丁前后差异
证据不足时,结论必须降级表达。
输出协议
不要频繁输出冗长推理。
进入利用或自动化前,输出:
决策卡
- 目标:
- 已知事实:
- 当前假设:
- 下一步最小验证:
- 切换条件:
关键发现输出:
关键证据
- 现象:
- 来源:
- 结论:
- 仍需验证:
输出 flag/key/token/shell 前必须说明:
- 来源路径
- 原始证据
- 二次校验方式
- 是否存在截断、编码、诱饵、大小写风险
```
5. 如何创建属于自己的最强提示词
5.1 明确当前环境
要让模型知道:
- shell 是 PowerShell、bash、zsh 还是 WSL;
- 哪些工具存在;
- 工具绝对路径在哪里;
- 哪些 MCP / Skill 在当前会话可用;
可以写一个 `refresh_runtime` 脚本,每次激活自动生成:
```markdown
Runtime
Generated at: <时间>
Windows Commands
- FOUND python -> ...
- FOUND node -> ...
- FOUND git -> ...
Preferred Absolute Paths
- FOUND tshark -> ...
- FOUND hashcat -> ...
- FOUND jadx -> ...
Python Modules
- FOUND requests
- FOUND pwn
- FOUND z3
- MISSING sageall
WSL Tools
- FOUND gdb
- FOUND checksec
- FOUND one_gadget
Fallback Rule
- Missing tools do not block progress.
```
这样模型每次启动时读到的是当前真实环境,而不是你几个月前手写的工具清单。
5.2 把提示词拆成模块,不要写成一坨
推荐目录结构:
```text
prompt_pack/
00_policy.md
10_runtime.generated.md
20_router.md
30_output.md
40_machine_tuning.md
modes/
sprint.md
deep.md
max.md
report.md
modules/
web.md
pwn.md
reverse.md
crypto.md
forensics.md
misc.md
sqli.md
jwt_auth.md
ssti_rce.md
deserialize.md
race.md
post_access.md
build_prompt.ps1
refresh_runtime.ps1
test_router.ps1
test_prompt_quality.ps1
ACTIVE_PROMPT.md
```
每层职责清楚:
- `00_policy.md`:稳定规则、边界、执行闭环;
- `10_runtime.generated.md`:自动探测的环境事实;
- `20_router.md`:题型识别、主副模块选择、切换条件;
- `30_output.md`:决策卡、证据块、结果校验;
- `40_machine_tuning.md`:这台机器的调度偏好;
- `modes/`:比赛冲刺、深挖、报告、最大强度;
- `modules/`:不同题型和副模块;
- `test_router.ps1`:防止路由规则改坏;
- `test_prompt_quality.ps1`:防止生成提示词缺关键段落。
这就是把提示词从"文本"升级成"工程"。
5.3 写机器调优,不写泛化建议
如果你机器里 `jadx.exe` 很好用,就写:
```markdown
Reverse/APK:
- APK 题优先 jadx.exe 静态拆解;
- 先看 Manifest、assets、res、native so;
- 出现 JNI 或运行时校验时,再考虑 adb + frida;
- 不先上复杂动态分析,除非静态路径无增量。
```
如果你 pwn 环境主要在 WSL,就写:
```markdown
Pwn:
- 需要 Linux 语义时优先 WSL;
- checksec/readelf/objdump/strings/gdb/one_gadget 均从 WSL 调;
- exploit 默认用 pwntools;
- 远程前必须先本地脚本化同步点。
```
如果你常打流量题,且有 Wireshark MCP,就写:
```markdown
Forensics/PCAP:
- 优先 Wireshark MCP 做协议分布、会话、对象导出、明文凭证、异常检测;
- MCP 不可用时降级 tshark.exe;
- 不先打开 GUI 慢慢看,除非需要人工视觉判断。
```
这类提示词会显著提高模型的本地化战斗力。
5.4 给每个模块写"首轮动作 + 止损条件"
只写攻击方法是不够的。每个模块至少要有:
- 前 5 分钟固定动作;
- 最小验证方法;
- 自动化触发条件;
- 常见失败应对方法;
- 路径切换条件;
- 结果校验方式。
例如 SQLi 副模块:
```markdown
SQLi 模块
触发条件:
- 单引号、括号、注释符造成稳定差异;
- 布尔恒真/恒假造成稳定差异;
- 时间函数造成稳定延迟;
- 报错中出现 SQL 语义;
- 源码中存在拼接 SQL。
最小验证:
- 正常值 vs 特殊字符 vs 布尔条件;
- 每组至少重复两次;
- 记录状态码、长度、关键文本、耗时。
止损:
- 两轮无稳定差异,停止堆 payload;
- 如果响应被缓存或 WAF 干扰,先换观察指标;
- 如果注入点不稳定,转源码、接口、鉴权、泄露路径。
自动化:
- 已确认注入语境后,再写布尔/时间盲注脚本或调用 sqlmap;
- 不在未确认语境时直接大规模扫描。
```
这会让模型少做很多无意义爆破。
6. 比赛中如何和大模型协作
提示词只是底座,使用方式也很重要。
8.1 给模型的输入要像"案件材料",不要像"猜谜"
错误示范:
```text
这个 Web 题怎么做?
靶机:....给我flag
```
更优方案:
```text
题型:Web
目标:http://challenge.local:8080
已知:有登录页,可以注册;登录后有 /profile?id=1;Cookie 是 session=...
我已经测过:
- /robots.txt 404
- /.git/HEAD 403
目标:拿 flag
```
8.2 每轮只让它推进一个明确目标
不要问:
```text
继续看看还有什么漏洞。
```
要问:
```text
基于刚才响应差异,判断是否值得进入 SQLi 路线,若否,给出当前建议的路线。
```
防止模型发散
7. 一个实战版"最强提示词构建流程"
如果要从零开始打造自己的 CTF prompt pack,可以按下面步骤做。
Step 1:写稳定 policy
只写不会频繁变化的东西:
- 适用边界;
- 默认解题流程;
- 结果校验;
- 止损切换;
- 输出格式;
Step 2:写 runtime 探测脚本
自动探测:
- 各种环境和工具状态,上文有提到
Step 3:写模块
每个模块包含:
- 触发条件;
- 前 5 分钟;
- 最小验证命令;
- 常见路径;
- 自动化条件;
- 止损条件;
- 常见错误;
- 校验方式。
Step 4:写 output
规定:
- 什么时候输出决策卡;
- 什么时候输出证据块;
- 什么时候输出脚本;
- 什么时候输出最终结果;
- 什么时候输出完整 WP。
Step 5:写 mode
gpt5.5建议四种:
- `sprint`:比赛冲刺,少解释,多验证;
- `deep`:复杂题,保留更多假设账本;
- `max`:最大强度,允许并行与更 aggressive 工具调度;
- `report`:赛后写 WP,结构完整,复盘清楚。
8. 最后:提示词的本质是注意力分配器
大模型并不缺知识,它缺的是在复杂环境中分配注意力的纪律。
CTF 题目会故意制造噪声:假 flag、误导字符串、无用页面、错误提示、看似熟悉但实际变形的漏洞链。弱提示词会让模型的注意力被噪声牵走;强提示词会让模型始终围绕证据、验证、工具、路径切换和结果校验运行。
所以,CTF 提示词调优的最终目标是让模型每一步都回答:
- 当前事实是什么?
- 当前最强假设是什么?
- 下一步最小验证是什么?
- 用哪个本机工具最快?
- 失败后切到哪里?
- 结果如何校验?
如果你的提示词能持续逼模型回答这些问题,它就不再只是聊天助手,而是一个真正能参与 CTF 解题的 agent。