文章总结: 本文是一篇CTF实战经验分享,核心观点是多数队伍输在节奏而非技术。文章系统阐述了赛前环境准备清单、开赛扫题填表、三档题目策略、卡题三十分钟换人规则、AWD防守优先原则、团队协作纪律及赛后复盘方法,强调将48小时比赛时间切成可执行的计划表,通过合理分工与节奏控制提升比赛成绩。
综合评分: 88
文章分类: CTF,实战经验,红队
一场 CTF 的 48 小时:从开题到提交 flag,怎么打才不崩
原创
Sink
Sink
船山信安
2026年9月23日 08:39
湖南
在小说阅读器读本章
去阅读
在公众号小说中沉浸阅读
竞技 · CTF
一场 CTF 的 48 小时:从开题到提交 flag,怎么打才不崩
实战手记 · 写给打过几场、但总觉得乱的人
多数队伍不是输在技术上,是输在节奏上。同一份题,有人第二天凌晨就收工了,有人撑到收官还在补一个本该第一小时做掉的签到。这篇不教你某一道题怎么解,只讲从赛前到赛后,时间该怎么切、人该怎么分、卡住了往哪拐。打得很乱的人,缺的通常不是本事,是一张能照着走的表。
01赛前 24 小时:别把时间浪费在装环境上
比赛还没开始,就已经有人在丢分了。
常见的情况是:开赛半小时后,某道题的利用脚本差一个库,pip install 卡在镜像源上;另一个人发现 pwntools 没装,临时编译耽误了四十分钟。这些事本该在前一晚做完,而且做完的标志不是”我记得装过”,是”开着虚拟机跑通了一遍”。
赛前该过的清单,列出来其实不复杂,难的是逐条打勾:
| | |
| — | — |
| 项目 | 说明 |
| 虚拟机快照 | 开赛前留一个干净快照,崩了能回滚;别等装了一堆东西再想起来 |
| 工具链 | pwntools、Ghidra/IDA、Wireshark、Burp、hashcat 各跑一次确认可用 |
| Python 环境与常用库 | pycryptodome、z3、requests、sage 等,比赛网通常是隔离的,别指望现下 |
| 网络 | 确认 VPN / 靶机网段可达,DNS 能解析;AWD 还要先验通各队网段 |
| 账号 | 平台账号提前登录,二次验证先关或备好,别开赛才找回密码 |
| 备用网络 | 手机热点备用,场馆 WiFi 抽风时至少能交 flag |
| 吃的喝的 | 水、咖啡因、能顶饿的东西;48 小时赛里,第三十小时的人会把这事忘干净 |
清单里”虚拟机快照”这一行,很多人会偷懒换成”我拷了份文件就行”。差得很远。你会遇到的典型情况是:装库装到一半把 Python 环境搞坏,pip 自己都起不来,这时候你手上有的是一份打不开的备份,不是一台能跑的机器。快照的好处是它能把你整个运行时原样冻住——回滚之后,连你昨天调好的别名都还在。赛前花两分钟拍快照,比赛中花两小时救环境便宜得多。
比赛开始后才装 pwntools 的人,每年都有。这不是段子,是每场线下都能见到的真实画面。环境是赛前唯一完全由你掌控的变量,把它搞利索,等于白捡一小时。
02开赛前三十分钟:先别做题
开赛铃一响,最贵的动作不是急着点开第一题,是把所有题扫一遍。
解题意外的便宜,藏在这三十分钟里。你快速过完所有方向,能立刻看出哪几道是送分、哪几道是坑、哪几道全队都没碰过。等别人埋头在一道题里泡了两小时,你手里已经有一张全图——后面每一次”该做哪道”都不用重新判断,照表走就行。
这张表长这样,开赛前就建好空表,扫题时往里填:
| | | | | |
| — | — | — | — | — |
| 题目 | 方向 | 预估难度 | 谁接 | 状态 |
| web-01 | Web | 易 | A | 进行中 |
| pwn-02 | Pwn | 中 | B | 待认领 |
| crypto-03 | Crypto | 难 | C | 观察 |
| misc-04 | Misc | 易 | A | 排队 |
| rev-05 | Reverse | 中 | C | 待认领 |
为什么这三十分钟是全场性价比最高的时间?因为它把”决策成本”集中预付了。之后整场比赛中,你不再需要每次纠结下一题做哪个——表上有空位、有难度、有人名,眼睛扫一下就知道。省下来的不是三十分钟,是之后每隔半小时就要重新想一遍的犹豫。
扫题时怎么快速估难度?不靠猜,看三个信号:附件大小与类型(一个几 KB 的二进制通常比几十 MB 的取证轻)、题目描述里甩出来的关键词(”简单替换””入门”基本是送,出现”混淆””自研算法”就要留神)、以及榜上别人解出的速度。前几道被秒掉的,大概率是签到;过了两小时还没人动的,要么极难要么有坑。这三样凑起来,估出来的难度比凭感觉靠谱。
扫题时有个反直觉的提醒:别在扫题阶段就动手解。见过有人扫到一道眼熟的题,顺手做到一半,回头发现另一道更简单的签到已经被别人全拿走了。前三十分钟只做两件事——判断、填表。
03三档策略:签到达血,中段攻坚,难题慢磨
先说一个计分上的事实,它决定你的出手顺序。
解题赛里,最先解出的前几支队伍通常有额外加分。CTF Wiki 把这种机制记成 first blood / second blood / third blood——前三支解出的队伍拿额外分。早期赛事如 Mozilla CTF 给的是 3 / 2 / 1 的奖励分。另一套常见规则是”降分”:一道题初始分固定,随着解出人数变多,分值逐步下探到一个保底值就不再降。两条规则指向同一件事——早解比晚解值钱,第一比第二值钱。
把降分机制算清楚了,你才会认真抢第一小时。一道 500 分的题,等全场三十队都解出来,可能只剩 100 分保底;你晚动手两小时,不是少赚那点首杀奖励,是整个分值基数塌了。反过来,签到题个子小但人人会做,它贬值得最快——所以”先捞简单的”不是保守,是算过账的贪心:在它归零前把它摘走。
所以开打后,把题分成三档来吃:
第一档:签到与简单题,先拿血量和排名。这类题不纠结,谁顺手谁上,目标是开赛一小时内把能拿的分全拿满。排名越高,对手越不敢小看你,队内士气也越稳。首杀加分摆在那里,慢一步就少一分。
第二档:中段攻坚,按人分工。中等难度按方向切给对应的人,Web 给 Web 手、Pwn 给二进制手,互不打扰。这一档是分数的主产区,节奏比技巧更关键——每个人手头只留一道,做完再领下一道。
第三档:难题留一个人慢慢磨,别全队扑上去。最贵的错误是全队围着一道题转。正确做法是派一个人盯住,其余人继续吃前 two 档。难题的边际收益不确定,全队投入的边际成本却是实打实的——把三个人锁在一道没思路的题上,等于主动放弃别的分。
分档的本质是承认一件事:分数不按”哪道题漂亮”结算,按”总分多少”结算。会取舍的队,常常赢过个人能力更强的队。
04卡题的正确处理:三十分钟,换人,留痕
人人都会卡题。区别在于卡了之后怎么动。
定一条硬规矩:卡满三十分钟,就换人或先放下。同一个人陷在一道题里超过半小时,脑子会越走越窄,重复试已经试过的路。换个人看,常常五分钟就指出你错在哪一环——不是他比你强,是他没有被你的错误假设绑住。
最容易被忽略的一步,是写下你已经排除过的假设。你会遇到的典型情况是:三个人轮着看同一道题,每个人都从头推一遍,又把”这条路不通”重新试了一遍,谁都没记下前面的人已经否决过什么。把排除项写进共享笔记,后来的人就不会在同一个坑里摔第二次。
举个具体的:一道密文题,你第一眼觉得是 AES,试了三轮密钥都不对,转头去吃饭。回来换人接手,他不知道你试过 AES,又花四十分钟把同样的轮子重造一遍。要是笔记里早写了一句”已排除 AES-ECB/AES-CBC,密钥非弱口令”,他省下的就是四十分钟。排除项的价值,等于你替后来的人把死路标了出来。
中间产物要留在共享笔记里,别只存在某个人电脑上。半成的脚本、跑出来的偏移、报错截图——这些比最终答案更值钱。换人接手时,他续上的不是从零开始,是你停下的那一秒。
第三小时常见的翻车方式是:两个人同时在改同一个 exploit.py,一个加了 sendlineafter,一个改了 recv 顺序,到头来谁的版本都跑不通,还互相覆盖。卡题的混乱,多半不是题难,是没人说清楚”现在这版是谁的”。
05攻防赛(AWD)是另一种游戏:守比攻更值钱
如果你只打过解题赛,第一次进 AWD 会很不适应。
解题赛里你只对自己负责;AWD 里每队守一台带漏洞的靶机,既要打别人拿 flag,又要修自己别被别人打穿。分数分两块:进攻分(拿下别队 flag)和防守分(自己的服务被裁判 check 正常)。很多赛制下,防守做不好不是”少得分”,是”倒扣”——服务挂了,正常队伍来分你的失分。
所以攻防赛的第一原则:加固的优先级高于攻击。拿到靶机先别急着写打别人的脚本,先把自家门堵上。开源的 AWD 手册(如奇安信星图实验室的《从零学习 AWD 比赛指导手册》、腾讯云社区的多篇赛后经验)都把这个顺序排在第一位:备份、改口令、上 WAF、布监控,然后才轮到出击。
一份能照着勾的加固清单:
| | |
| — | — |
| 动作 | 说明 |
| 改默认口令 | SSH、数据库、后台管理员密码第一时间统一改掉,弱口令是送分题 |
| 删除后门 | 源码拖下来过一遍查杀,清掉出题人预留的 webshell 与计划任务 |
| 文件监控与自恢复 | 监控可读写目录的增删,被种马立即还原;自恢复脚本保服务不 down |
| WAF 规则 | 部署通防脚本拦截常见攻击,注意别把服务搞挂触发 check 失败 |
| 日志留存 | 开流量与访问日志,别人打你的 payload 能回放,反手就是一发 |
| 备份 | 源码与数据库先打包下载,误改、被删都能秒回,是兜底里的兜底 |
攻防赛里守不住等于白打。你打出再漂亮的进攻,只要自家服务被别人一轮轮拿下,失分比得分跑得还快。进攻决定上限,防守决定你能不能活着见到上限。
日志那一行看着不起眼,关键时刻是反打的弹药。常见的局面是:你加固完了,还是被人打下来,但你开着流量日志,把对方打你的 payload 完整录了下来。这份流量能直接回放到别的队靶机上——他用来打你的那一下,往往对所有队都通用。所以日志留着,不只是自保,是白捡一波进攻素材。反过来,你自己打别人的流量记得混淆,别让人家同样回放回来。
flag 通常几分钟一轮刷新,手动提交不现实。提前备好批量提交脚本,开赛直接接上:
简化示意:每轮从己方服务取 flag,再批量提交
import requests
TOKEN = “你的队伍token”
SUBMIT = “http://scoreboard/submit”
FLAGS = open(“flags.txt”).read().splitlines()
for f in FLAGS:
r = requests.post(SUBMIT, data={“flag”: f, “token”: TOKEN})
print(f, r.text)
06协作纪律:看得见,才不乱
三到四人的队,崩掉往往不是因为不会,是因为互相看不见对方在干嘛。
flag 统一由一个人提交。谁解出来谁报给提交人,别各交各的。抢交、重复交、交错格式,每场都有,而提交窗口出错没人负责,分就白白飞了。
避免两个人同时改同一个文件。版本冲突在比赛里比平时更致命,因为没时间慢慢 merge。谁认领哪道题,在那张表里写死,别人需要的资料走共享笔记传,不直接动对方的文件。
用共享文档同步进度。在线表格实时更新每题状态、线索、试过的 payload。Securium Solutions 的组队指南也把”共享实时文档跟踪题目名、负责人、状态”列为基本动作——它防的不是偷懒,是重复劳动。
谁在做什么要看得见。抬头看一眼表,就知道 A 在打 Web、B 卡在 Pwn、C 在磨难题。看得见,才有人能喊”别死磕了换我来”,也才有人能及时补位。
07提交与留证:这一分,得留得住
分拿到了,还得确认它算数。
flag 有格式,最常见是 flag{...} 或 CTF{...}。大小写、花括号、前后空格,错一个字符就是零分。遇到过最冤的情况是:flag 解出来了,提交时多了个换行,平台判错,等发现时这题已经被别人拿了一血。
几个该养成的习惯:提交前先本地验证一遍,确认取到的是完整且格式对的字符串;同一条 flag 别怕多提交一次,平台通常幂等;截图和命令历史留档。前者应付平台争议,后者应付自己的申诉——你以为稳了的那题,赛后排名变动时可能要拿证据说话。
本地验证最常见的作用是拦住”假 flag”。你会遇到的情况是:脚本从远程拖回来一串像 flag 的字符串,兴奋地提交,跳红。原因可能是尾部多了个换行、大小写抄反、或者你抓的其实是别人的 banner 不是真 flag。先在自己机器上 echo -n 看一眼长度、对齐格式再交,这一步省下的不是分数,是反复提交消耗的耐心和那点本来就不多的窗口时间。
留证这件事,比赛当下觉得多余,赛后复盘和申诉时全用得上。能回放的过程,才经得起别人质疑。
08赛后 48 小时,才是分水岭
铃响那一刻,多数人的动作是关电脑、躺平。这很正常,也很可惜。
一场比赛真正的产出不在排名,在那 48 小时里你拿没拿它当教材。具体做四件事:
把没做出来的题按方向分类复现。卡住的题别让它过去。Web 归 Web、Pwn 归 Pwn,一道一道补,补的是你知识版图上的洞,不是面子。
读前排队伍的 writeup。同一道题,强队的解法常比你短一半。比较差异,学的是思路,不是答案。顶部战队在 CTFtime 上公开复盘,是免费的高手课。
自己写一份。能讲清楚”我当时怎么想的、卡在哪、后来怎么通”,这道题才真正归你。只存 flag 不写思路,下次换层皮你照样不会。
把不会的点变成下周的练习题。复盘的尽头是一个行动清单:哪个知识点薄弱,排进下周的训练。赛后 24 小时内开复盘会、专人记结论进知识库,是成熟战队的标配动作。
知识库怎么组织,决定了它用不用得起来。别堆成一个谁都不看的文件夹。按方向建目录——Web、Pwn、Crypto、Reverse、Misc 各一栏,每道题一个 Markdown,里面固定写四样:考察点、你卡在哪、关键命令与脚本、复盘心得。新队员入队先读三个月的 writeup,上手比从头带快得多。等你把几十场的 writeup 按标签叠起来,会看出出题趋势——某个方向某段时间突然变多,那就是下周该提前练的。
比赛结束,才是学习开始。名次会过期,你补上的那块短板不会。把每场都当教材的队,半年后和只当比赛的队,已经不是同一档。
ONE LINE
打得乱,不是因为不会,是因为没把时间切成能照着走的表。
参考来源
· CTF Wiki《CTF 竞赛模式简介》:解题模式 first blood / second blood / third blood 额外加分与降分机制
· CTFtime,Mozilla CTF 规则页:前三支解出队伍获 3 / 2 / 1 奖励分
· CTFtime 评分体系说明(Dragon Sector 战队 2018 赛季博客):赛事 rating weight 0–100,年度取前十场计入全球排名
· X1cT34m Wiki《CTF 介绍》:Jeopardy / Attack-Defense(AWD) / AWDP / King-of-the-Hill(KoH) 赛制定义
· 奇安信星图实验室《从零学习 AWD 比赛指导手册》:Linux / Windows 加固流程、备份与 WAF 部署
· 腾讯云开发者社区《说说 AWD 攻防赛流程以及准备经验》:防守流程、不死马克制、流量回放
· Securium Solutions《How to Build a CTF Team and Win Your First Competition》:共享文档跟踪、赛后复盘(retrospective)
· CTFtime.org:DEF CON CTF、PlaidCTF、HITCON CTF、0CTF/TCTF、Google CTF 等赛事公开赛制与排名
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:船山信安 Sink
Sink《一场 CTF 的 48 小时:从开题到提交 flag,怎么打才不崩》