Eventually a Flag

Beskrivning

Har du tålamod nog att vänta ett antal år på att flaggan skrivs ut?

Lösning

Till utmaningen får vi Python-scriptet printflag.py:

import string, time

alphabet = string.ascii_lowercase + string.ascii_uppercase + string.digits + "!#$%&()*+,-./:;<=>?@[]^_{|}~åäö "

ciphertext = "cq rbäl{%$0eYXm&5bV( Z&j@|2VoT2fVzö5)äXMömlfpmhhtawc]eiwvl2ö26a4Vm$3bP6@Rm5#r)ToR2p!XlZ.B8@);äfkldq=<}{[:#RkY4h55m8!r(,E{g:#z)-yRRäAs#nH?rbi|$|"

# TODO: Too much recursion?
def fibonacci(n: int) -> int:
    return n if n < 2 else fibonacci(n - 2) + fibonacci(n - 1)

for i, c in enumerate(ciphertext):
    print(alphabet[(alphabet.index(c) + fibonacci(i)) % len(alphabet)], end="", flush=True)
    time.sleep(0.03)
print()

Kör vi skriptet så tar det väldigt lång tid att köra klart eftersom det använder en rekursiv implementation av Fibonacci-funktionen som är oerhört ineffektiv för större värden på n. För att lösa utmaningen kan vi istället implementera Fibonacci-funktionen med memoization för att snabba upp beräkningarna:

import string

alphabet = string.ascii_lowercase + string.ascii_uppercase + \
    string.digits + "!#$%&()*+,-./:;<=>?@[]^_{|}~åäö "

ciphertext = "cq rbäl{%$0eYXm&5bV( Z&j@|2VoT2fVzö5)äXMömlfpmhhtawc]eiwvl2ö26a4Vm$3bP6@Rm5#r)ToR2p!XlZ.B8@);äfkldq=<}{[:#RkY4h55m8!r(,E{g:#z)-yRRäAs#nH?rbi|$|"

cache = {}

def fibonacci(n: int) -> int:
    if n in cache:
        return cache[n]

    if n < 2:
        cache[n] = n
        return n
    else:
        cache[n] = fibonacci(n - 2) + fibonacci(n - 1)
        return cache[n]


for i, c in enumerate(ciphertext):
    print(alphabet[(alphabet.index(c) + fibonacci(i)) %
          len(alphabet)], end="", flush=True)

print()

Kör vi detta skript får vi ut flaggan.

Flagga: cratectf{en ganska så lång flagga. mycket taskigt va? aja, den kanske tar slut någon gång.... eller?? abcdefghijklmnopqrstuvwxyzåäö:))) hejdå!}

n00bz

Home of the n00bz CTF team.


Write-up för CTF-utmaningen 'Eventually a Flag' från Crate CTF 2025

By n00bz, 2025-11-16