跳到主要内容

Flag 规则

CBCTF 支持三种 flag 类型,每道题可配置多个 flag,每个 flag 独立计分。

Flag 类型

类型配置格式生成结果(前缀 CBCTF特点
静态static{content}CBCTF{content}所有队伍相同
动态dynamic{template}CBCTF{ThiliS-iS-4_Dyn4MIC_FLaG}每队不同,长度可变
UUIDuuid{}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 字段配置,不同比赛可以使用不同前缀(如 flagCTFCBCTF)。