주어진 소스는 다음과 같다. 옛날 문제라 문제 서버가 닫혀있어서 그냥 소스에 플래그 임의로 구성해서 풀었다.
from Crypto.Util.number import *import uuid
BLOCKSIZE = 32
key_1 = uuid.uuid4().hexkey_2 = uuid.uuid4().hex
flag = "HZVII{Test_Flag_Easy_Xor_Challenge!!!!!!!!!!!!!}"
def menu(): print() print('[1] Encrypt') print('[2] Get Flag') print('[3] Exit') return input()
def chunky(string): return (string[0 + i:BLOCKSIZE + i] for i in range(0, len(string), BLOCKSIZE))
def encrypt(m): m = m cipher = "" chunks = list(chunky(m)) if len(chunks) > 10: return "Calm down i'm not your slave .. " key = key_1 for n in chunks: cipher += hex(int(n, 16) ^ int(key, 16) ^ int(key_2, 16))[2:] key = hex(int(key, 16) // 2)[2:] return cipher
while True:
choice = menu()
if choice == '1': m = bytes_to_long(input('\nYour_Plain >> ').strip().encode()) print('\nCipher: ' + str(encrypt(hex(m)[2:])))
elif choice == '2': print('\nFlag: ' + encrypt(hex(bytes_to_long(flag.encode()))[2:]))
elif choice == '3': print('See ya H4cK3r') break
코드를 보면 키 값을 알 수 없는 상황이지만 암호화가 단순 xor 연산이라 그냥 플래그랑 동일한 크기의 인풋 으로 암호화 값을 구하고 이거 두 개를 xor해서 key 값을 구해주면 된다. 그 다음 플래그 암호화 값을 구해서 키 값이랑 위 코드 암호화 로직에 맞춰 xor 돌려주면 플래그를 구할 수 있다.
decrypt.py
from Crypto.Util.number import *
def get_key(input,enc_input):
hex_input = hex(bytes_to_long(input.encode()))[2:]
key_list = []
for i in range(0,len(hex_input),32):
key_list.append(int(hex_input[i:i+32],16)^int(enc_input[i:i+32],16))
return key_list
def decrypt(enc_flag,key_list):
dec_flag = ""
for i in range(0,len(enc_flag),32):
dec_flag += bytes.fromhex(hex(int(enc_flag[i:i+32],16)^key_list[int(i/32)])[2:]).decode("utf-8")
return dec_flag
enc_flag = "8719d71f952e5ac948ae838f2d443c63db783fd5faed08878d56e93b16d74449d1d10b70b864727807d30eb2c6553d57"
input = "1"*48
enc_input = "fe72b067ed643f9d0aebedf870146a0daf287d9d948456c4e324b06b4b8a101687851b60a874626817c31ea2d6452d1b"
key_list = get_key(input,enc_input)
print(decrypt(enc_flag,key_list))
'Crypto & Network & Etc > Crypto Practice' 카테고리의 다른 글
Plaid CTF 2015 Strength (0) | 2019.11.11 |
---|---|
TokyoWesterns CTF 2019 baby_rsa (0) | 2019.11.11 |
KCTF Operation 1 (0) | 2019.11.08 |
TG:Hack 2019 CTF Josefssons Final Exam (0) | 2019.11.07 |
RITSEC CTF 2018 Nobody uses the eggplant emoji (0) | 2019.11.07 |