Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import string
- from base64 import b64decode
- # placeholder for the flag
- flag = "NOONCTF{flag_placeholder}"
- # Given encrypted flag
- given = ['', '00111111', '01010010', '01101001', '00000100', '00111000', '01010101', '01111101', '00010010', '00010011', '00011111', '01101101', '01010101', '00001000', '00101000', '01110001', '01101011', '01101011', '01011000', '00011100', '00010011', '00110010', '01101110', '00001001', '01111100', '00110111', '00110100', '00101000', '00000100', '00110110', '00011010', '00101000', '00000100', '00001000', '00101000', '01110001', '01101011', '01101011', '01011000', '00011100', '00010011', '00110010', '01101111', '01010010', '00100110', '00001010', '01110011', '00000111', '01101011', '00100010', '00111000', '00111011', '00100001', '01101010', '00000010', '00000000', '01010101', '00110010', '00011110', '00110011', '00100010', '01101011', '01011000', '00011100', '00010011', '00110010', '01101110', '00001001', '01111111', '00110100', '00111100', '00110101', '00010001', '00100100', '01111111', '01010010', '00100110', '00000101', '01111000', '00001101']
- # Get the first letter of the flag
- def get_first_letter():
- first_letter_guess = list(
- string.ascii_lowercase + string.ascii_uppercase + string.digits + '{}'
- )
- return first_letter_guess
- # Encrypt the flag
- def encrypt(flag):
- arr = []
- for i in range(len(flag) - 1):
- c = format(ord(flag[i]), 'b')
- cn = format(ord(flag[i + 1]), 'b')
- if len(c) < 8:
- c = ((8 - len(c)) * "0") + c
- if len(cn) < 8:
- cn = ((8 - len(cn)) * "0") + cn
- item = []
- for l in range(len(c)):
- item.append(str(int(c[l]) ^ int(cn[l])))
- arr.append("".join([str(e) for e in item]))
- return arr
- # Decrypt the flag after adding the first letter to the encrypted flag
- def decrypt(given_copy, first_letter):
- # Convert the first letter to binary
- first_letter_byte = format(ord(first_letter), 'b')
- # Add padding to the first letter if it is less than 8 bits
- if len(first_letter_byte) < 8:
- first_letter_byte = ((8 - len(first_letter_byte)) * "0") + first_letter_byte
- # Copy the given flag to avoid changing the original flag
- tmp = given_copy.copy()
- # Add the first letter to the beginning of the flag
- tmp[0] = first_letter_byte
- for i in range(len(tmp) - 1):
- item = []
- for l in range(len(tmp[i])):
- item.append(str(int(tmp[i][l]) ^ int(tmp[i + 1][l])))
- tmp[i] = "".join([str(e) for e in item])
- return "".join([chr(int(tmp[i], 2)) for i in range(len(tmp))])
- # Print the flag to a file named "CTF_Match.txt" to match the CTF pattern
- def print_flag(flag):
- with open("CTF_Match.txt", "a") as file:
- file.write(flag + "\n")
- def main():
- # Get the first letter of the flag
- first_letter_guess = get_first_letter()
- # Decrypt the flag after adding the first letter to the encrypted flag
- for c in first_letter_guess:
- try:
- decrypted = decrypt(given, c)
- decrypted = b64decode(decrypted).decode("utf-8")
- print_flag(decrypted)
- except:
- pass
- if __name__ == "__main__":
- main()
Add Comment
Please, Sign In to add comment