Flag 规则
CBCTF 支持三种 flag 类型, 每道题可配置多个 flag, 每个 flag 独立计分。
Flag 类型
| 类型 | 配置格式 | 生成结果(前缀 CBCTF) | 特点 |
|---|---|---|---|
| 静态 | static{content} | CBCTF{content} | 所有队伍相同 |
| 动态 | dynamic{template} | CBCTF{ThiliS-iS-4_Dyn4MIC_FLaG} | 每队不同, 长度可变 |
| UUID | uuid{} | CBCTF{550e8400-e29b-41d4-a716-446655440000} | 每队不同, 标准 UUID 格式 |
flag 的实际前缀由比赛配置中的
prefix字段决定, 而非固定为CBCTF。
静态 Flag
配置: static{this_is_a_static_flag}
生成: CBCTF{this_is_a_static_flag}
所有队伍的 flag 内容相同。适用于所有题目类型。
动态 Flag
配置: dynamic{this_is_a_dynamic_flag}
生成: CBCTF{ThiliS-iS-4_Dyn4MIC_FLaG}
基于模板随机替换字符, 保持可读性。生成结果的长度可能与模板长度不同, 题目设计中不得依赖 flag 长度。
UUID Flag
配置: uuid{}
生成: CBCTF{550e8400-e29b-41d4-a716-446655440000}
标准 UUID v4 格式, 长度固定, 每队不同。
Flag 注入方式
动态附件题
平台自动调用生成器容器中的 /root/run.sh 脚本, 将 flag 作为参数传入:
/root/run.sh {team_id} {base64(base64(flag1),base64(flag2),...)}
示例(team_id=1, 两个 flag):
/root/run.sh 1 UTBKRFZFWjdabXhoWnpGOSxRMEpEVkVaN1pteGhaeko5
其中第二个参数为 base64(base64("CBCTF{flag1}") + "," + base64("CBCTF{flag2}")) 的结果。
容器题
方式一: 环境变量注入
环境变量名必须以 FLAG_ 为前缀, 平台在启动容器时替换 flag 值:
services:
web:
image: nginx:latest
environment:
- FLAG_1=dynamic{this_is_a_dynamic_flag}
- FLAG_2=static{this_is_a_static_flag}
- FLAG_3=uuid{}
ports:
- "80:80"
方式二: Volume 文件注入
通过 volume labels 配置 flag, 平台将 flag 写入容器内挂载的文件路径:
services:
web:
image: nginx:latest
volumes:
- FLAG_1:/flags/flag1.txt
- FLAG_2:/flags/flag2.txt
ports:
- "80:80"
volumes:
FLAG_1:
labels:
- value=uuid{}
FLAG_2:
labels:
- value=dynamic{this_is_a_dynamic_flag}
Flag 生成时机
队伍的 flag 仅在初始化(init)或重置(reset)时生成, 容器重启不重新生成 flag。
这意味着:
- 选手重启容器不会改变 flag
- 选手执行「重置题目」时会生成新 flag, 旧 flag 失效
- 题目测试模式(admin)不产生真实 flag 记录
多 Flag 配置
每道题可配置多个 flag, 每个 flag 独立计分。选手提交其中任一 flag 即可获得对应分数, 提交所有 flag 可获得该题目的全部分数。
Flag 前缀由所在比赛的 prefix 字段配置, 不同比赛可以使用不同前缀(如 flag、CTF、CBCTF)。