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å!}