一场CTF的48小时:从开题到提交flag,怎么打才不崩

admin 2026-09-24 05:30:46 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文是一篇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,怎么打才不崩》

评论:0   参与:  0