주어진 소스는 다음과 같다. 옛날 문제라 문제 서버가 닫혀있어서 그냥 소스에 플래그 임의로 구성해서 풀었다.


source.py

from Crypto.Util.number import *
import uuid

BLOCKSIZE = 32

key_1 = uuid.uuid4().hex
key_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
블로그 이미지

JeonYoungSin

메모 기록용 공간

,