From 018262bdaa783efd7a45ef0b374969bc4b44329e Mon Sep 17 00:00:00 2001 From: Leonhard Date: Mon, 25 May 2026 16:15:54 +0200 Subject: [PATCH] Feat: Add easy mode to generate.py and make it default --- codegen/generate.py | 40 ++++++++++++++++++++++++++++++---------- 1 file changed, 30 insertions(+), 10 deletions(-) diff --git a/codegen/generate.py b/codegen/generate.py index b391a4d..56c6c95 100644 --- a/codegen/generate.py +++ b/codegen/generate.py @@ -1,5 +1,6 @@ import random import sys +import os def generate_flag(length): characters = list("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789") @@ -13,7 +14,7 @@ def custom_op_xor(value, amount): return (((value << amount) ^ 0xFF) >> amount) -manglers = [ +hard_manglers = [ (lambda value: custom_op_xor(value, 5), lambda value: f"trunc_xor({value}, 5)"), (lambda value: custom_op_xor(value, 3), lambda value: f"trunc_xor({value}, 3)"), (lambda value: custom_op_xor(value, 2), lambda value: f"trunc_xor({value}, 2)"), @@ -26,7 +27,17 @@ manglers = [ # (lambda value: value, lambda value: f"{value}") ] -def mangle(value): +easy_manglers = [ + (lambda value: value + 1, lambda value: f"{value} + 1"), + (lambda value: value - 1, lambda value: f"{value} - 1"), + (lambda value: value * 2, lambda value: f"{value} * 2"), + (lambda value: value ^ 0xAB, lambda value: f"({value} ^ 0xAB)"), + (lambda value: value, lambda value: f"{value}") +] + + + +def mangle(value, manglers): result = b"" c_manglers = [] @@ -42,11 +53,18 @@ def mangle(value): return (result, c_manglers) -def get_check_code(flag_part, user_part, c_mangler): - variations = [ - f"custom_jmp_neq({flag_part} ^ 0x7C, {c_mangler(user_part)}, label_false);", - f"custom_jmp_neq({flag_part}, {c_mangler(user_part)} ^ 0x7C, label_false);" - ] +def get_check_code(flag_part, user_part, c_mangler, difficulty): + + if difficulty == "HARD": + variations = [ + f"custom_jmp_neq({flag_part} ^ 0x7C, {c_mangler(user_part)}, label_false);", + f"custom_jmp_neq({flag_part}, {c_mangler(user_part)} ^ 0x7C, label_false);" + ] + else: + variations = [ + f"if({flag_part} != {c_mangler(user_part)}) {{ return false; }}" + ] + return random.choice(variations) def main(): @@ -64,6 +82,8 @@ def main(): if flag_seed.lower() != "false": random.seed("totallysecurepadding" + flag_seed + "sonoonecanguesstheflag!") + difficulty = os.getenv("DIFFICULTY", "EASY") + # Generate a secret secret = generate_flag(flag_len) secret = flag_format.replace("FLAG_GOES_HERE", secret) @@ -71,7 +91,7 @@ def main(): eprint(f"Generated Flag: {secret}") # Change the bytes of the secret - mangled_secret, c_manglers = mangle(secret) + mangled_secret, c_manglers = mangle(secret, easy_manglers if difficulty == "EASY" else hard_manglers) # Shuffle the secret, but keep track of the order # We need this so we know the real location of the characters to compare @@ -89,7 +109,7 @@ def main(): checks = [] for i, c_mangler in enumerate(c_manglers): - checks.append(get_check_code(f"MANGLED[{i}]", f"userflag[{secret_shuffleorder[i]}]", c_mangler)) + checks.append(get_check_code(f"MANGLED[{i}]", f"userflag[{secret_shuffleorder[i]}]", c_mangler, difficulty)) random.shuffle(checks) check = "\n".join(checks) @@ -108,7 +128,7 @@ def main(): static volatile uint8_t MANGLED[] = "{mangled_secret}"; bool check(char* userflag, uint8_t len) {{ - custom_jmp_neq(len ^ 0x7C, {len(secret)}, label_false); + {f"custom_jmp_neq(len ^ 0x7C, {len(secret)}, label_false);" if difficulty == "HARD" else f"if (len != {len(secret)}) {{ return false; }}"} {check}