diff --git a/.env.example b/.env.example index 70a85d0..8fd71ab 100644 --- a/.env.example +++ b/.env.example @@ -1,5 +1,6 @@ FLAG_LEN=32 FLAG_FORMAT=ctf{FLAG_GOES_HERE} +FLAG_SEED=false ENCRYPTOR_VENDOR_ID=GenuineIntel ENCRYPTOR_MODEL_NAME=Intel(R) Core(TM) i7-6500U CPU @ 2.50GHz ENCRYPTOR_OS_VERSION=7.0.3-arch1-2 diff --git a/Makefile b/Makefile index d176766..10a442d 100644 --- a/Makefile +++ b/Makefile @@ -8,6 +8,7 @@ endif # Default configuration FLAG_LEN ?= 32 FLAG_FORMAT ?= ctf{FLAG_GOES_HERE} +FLAG_SEED ?= false # Compilation variables RISCV_CC ?= riscv64-unknown-elf-gcc @@ -105,7 +106,7 @@ endif $(GENERATED): .FORCE mkdir -p $(dir $@) - python codegen/generate.py $(FLAG_FORMAT) $(FLAG_LEN) > $@ + python codegen/generate.py $(FLAG_FORMAT) $(FLAG_LEN) $(FLAG_SEED) > $@ build: diff --git a/README.md b/README.md index 8ced54e..6f1c007 100644 --- a/README.md +++ b/README.md @@ -27,6 +27,7 @@ The provided `.env.example` file contains a sample configuration. - `FLAG_LEN`: Number, the length of the flag - `FLAG_FORMAT`: String, containing the constant `FLAG_GOES_HERE` to be replaced by the flag +- `FLAG_SEED`: String, the seed used to generate the flag, or `false` if it should be random - `ENCRYPTOR_VENDOR_ID`: String, overwrite CPU vendor id. Will use system information if unset - `ENCRYPTOR_MODEL_NAME`: String, overwrite CPU model name. Will use system information if unset - `ENCRYPTOR_OS_VERSION`: String, overwrite OS version. Will use system information if unset diff --git a/codegen/generate.py b/codegen/generate.py index 4dd9c41..7f2e7ff 100644 --- a/codegen/generate.py +++ b/codegen/generate.py @@ -1,7 +1,10 @@ import random -import secrets import sys +def generate_flag(length): + characters = list("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789") + return "".join([random.choice(characters) for _ in range(length)]) + def eprint(*args, **kwargs): print("[Codegen]", *args, file=sys.stderr, **kwargs) @@ -47,16 +50,22 @@ def get_check_code(flag_part, user_part, c_mangler): return random.choice(variations) def main(): - if len(sys.argv) != 3: - eprint(f"Usage: {sys.argv[0]} ") + if len(sys.argv) != 3 and len(sys.argv) != 4: + eprint(f"Usage: {sys.argv[0]} [flag_seed]") exit(1) # Flag prefix is not used, currently the flag is just used as-is flag_format = sys.argv[1] flag_len = int(sys.argv[2]) + if len(sys.argv) >= 4: + # We might have a seed + flag_seed = sys.argv[3] + if flag_seed.lower() != "false": + random.seed(flag_seed) + # Generate a secret - secret = secrets.token_urlsafe(flag_len) + secret = generate_flag(flag_len) secret = flag_format.replace("FLAG_GOES_HERE", secret) eprint(f"Generated Flag: {secret}")