Skip to content

Challenge Repository Specification v0.1

Challenge Repository Structure

.
└── 📁 {repo_name}/
    ├── 📁 challenges/
    │   ├── 📁 {category_name}/
    │   │   ├── 📁 ...
    │   │   └── 📄 README.md
    │   ├── 📁 ...
    │   └── 📄 README.md
    └── 📄 ctf_config.toml
File/Directory Description
challenges/ Directory containing folders for each challenge category specified in the ctf_config.toml file.
challenges/{category_name}/ Directory containing the challenges for that category.
README.md Markdown file containing information such as the difficulty distribution, challenge info, and services.
ctf_config.toml TOML file containing metadata about the repository.

Example

# CTF Repository Metadata File (version 0.1)
# This file is machine generated. DO NOT EDIT unless you know what you are doing.
# This is the file to specify to ctf-architect when creating a new challenge.

# ----------------- CTF Config Specification Version (required) ------------------
version = "0.1"


# --------------------------- CTF Config Info (required) -------------------------
# This section specifies the information about the CTF repository.
# Some fields are required, while others are optional:
# - categories: The categories of challenges
# - difficulties: The difficulties of challenges
# - flag_format (optional): The format of the flags
# - starting_port (optional): The starting port for the challenge services
# - name: The name of the CTF

[config]
categories = ["web", "crypto", "pwn", "re", "misc", "forensics", "osint"]
difficulties = ["easy", "medium", "hard"]
flag_format = "flag{.*}"
starting_port = 8000
name = "Demo CTF"


# ------------------------- CTF Config Extras (optional) -------------------------
# This section specifies extra fields that challenges should have.
# The fields can be required or optional, and can be of the following types:
# - string: A string value
# - integer: An integer value
# - float: A float value
# - boolean: A boolean value
#
# The fields are specified as a list of tables, where each table has the following fields:
# - name: The name of the field
# - description: The description of the field
# - prompt: The prompt to display to the user when entering the field
# - required: Whether the field is required or not
# - type: The type of the field
[[config.extras]]
name = "discord"
description = "Discord username"
prompt = "Enter your Discord username"
required = true
type = "string"

Fields

categories

A list of valid categories for the challenges in the repository.

categories = ["misc", "web", "forensics", "crypto", "reverse", "pwn"]

difficulties

A list of valid difficulties for the challenges in the repository.

difficulties = ["easy", "medium", "hard"]

name

The name of the CTF.

name = "Demo CTF"

flag_format (optional)

Flag format that static flags in challenges have to follow.

flag_format = "flag{.*}"

starting_port (optional)

The port number to start assigning to services with.

If you are using CTF Architect to deploy challenges, you must specify this field.

starting_port = 8000

extras (optional)

A list of extra fields that challenges added to this repository must specify.

Example:

[[config.extras]]
name = "discord"
description = "Discord username"
prompt = "Enter your Discord username"
required = true
type = "string"

Extras Fields

name

The name of the extra field.

name = "discord"

description

A description of the field.

description = "Discord username of the author"

prompt

The prompt to display to the user when entering the field.

prompt = "Enter your Discord username"

required

Whether the field is required or not.

required = true

type

The type of the field. Must be one of the following:

  • string : A string value
  • integer: An integer value
  • float : A float value
  • boolean: A boolean value
type = "string"