picoctf/crypto/waves_over_lambda/solve.py

86 lines
2.0 KiB
Python
Executable File

#!/usr/bin/env nix-shell
#!nix-shell -i python -p python3
# NOTE: the colors are used to keep track of which letters have been
# already substituted, and which are still unknown.
def green(s):
return f"\033[42m{s}\033[0m"
def red(s):
return f"\033[41m{s}\033[0m"
def substitute(cipher_text, substitution_map):
for letter in cipher_text:
if letter in substitution_map:
print(green(substitution_map[letter]), end="")
else:
print(red(letter), end="")
with open('ciphertext', 'r') as file:
enc = file.read()
# Here, I will be slowly substituting the letters in the ciphertext
# based on what I believe the words to be. I have commented out the
# invocations of substitute, and commented the newly found letters
# after each invocation.
# Starting off, "csds bh reod kzim" looks like "here is your flag"
substitution_map = {
'-': '-',
'_': '_',
'\n': '\n',
' ': ' ',
',': ',',
'.': '.',
';': ';',
'c': 'h',
's': 'e',
'd': 'r',
'b': 'i',
'h': 's',
'r': 'y',
'e': 'o',
'o': 'u',
'k': 'f',
'z': 'l',
'i': 'a',
'm': 'g',
}
# substitute(enc, substitution_map)
# found: euro't'e, ligh'a', o'f'er, 'q'ri'a'ish
# suspect: euro p e, ligh t, o v er, b ri t ish
substitution_map['t'] = 'p'
substitution_map['a'] = 't'
substitution_map['f'] = 'v'
substitution_map['q'] = 'b'
# substitute(enc, substitution_map)
# found: visite'n', british 'y'useu'y', sear'p'h, havi'x'g
# suspect: visite d , british m useu m , sear c h, havi'n'g
substitution_map['n'] = 'd'
substitution_map['y'] = 'm'
substitution_map['p'] = 'c'
substitution_map['x'] = 'n'
# substitute(enc, substitution_map)
# found: fre'g'uency, 'l'no'w'n, 'j'ust, e'v'act
# suspect: fre q uency, k no w n, j ust, e'x'act
substitution_map['g'] = 'q'
substitution_map['l'] = 'k'
substitution_map['w'] = 'w'
substitution_map['j'] = 'j'
substitution_map['v'] = 'x'
substitute(enc, substitution_map)
# still not sure about 'u'? But flag is found