13377_e3dd25795e7a6053f2df0aa399b3cf34.py
1 #!/usr/bin/env python3 2 3 from Crypto.Util.number import bytes_to_long, long_to_bytes 4 from utils import listener 5 import base64 6 import codecs 7 import random 8 9 FLAG = "crypto{????????????????????}" 10 ENCODINGS = [ 11 "base64", 12 "hex", 13 "rot13", 14 "bigint", 15 "utf-8", 16 ] 17 with open('/usr/share/dict/words') as f: 18 WORDS = [line.strip().replace("'", "") for line in f.readlines()] 19 20 21 class Challenge(): 22 def __init__(self): 23 self.challenge_words = "" 24 self.stage = 0 25 26 def create_level(self): 27 self.stage += 1 28 self.challenge_words = "_".join(random.choices(WORDS, k=3)) 29 encoding = random.choice(ENCODINGS) 30 31 if encoding == "base64": 32 encoded = base64.b64encode(self.challenge_words.encode()).decode() # wow so encode 33 elif encoding == "hex": 34 encoded = self.challenge_words.encode().hex() 35 elif encoding == "rot13": 36 encoded = codecs.encode(self.challenge_words, 'rot_13') 37 elif encoding == "bigint": 38 encoded = hex(bytes_to_long(self.challenge_words.encode())) 39 elif encoding == "utf-8": 40 encoded = [ord(b) for b in self.challenge_words] 41 42 return {"type": encoding, "encoded": encoded} 43 44 # 45 # This challenge function is called on your input, which must be JSON 46 # encoded 47 # 48 def challenge(self, your_input): 49 if self.stage == 0: 50 return self.create_level() 51 elif self.stage == 100: 52 self.exit = True 53 return {"flag": FLAG} 54 55 if self.challenge_words == your_input["decoded"]: 56 return self.create_level() 57 58 return {"error": "Decoding fail"} 59 60 61 listener.start_server(port=13377) 62