#!/usr/bin/python3
import codecs
import binascii
def encrypt(flag, key):
    enc = ''
    for i in range(len(flag)):
        enc += chr(ord(key[i % len(key)]) ^ ord(flag[i]))
    return enc

def main():
    key = open('key').read()
    key_len = len(key)
    flag = open('flag').read()

    while (1):
        print ("1. encrypt")
        print ("2. re-generate key")
        print ("3. bye")

        choice = input("> ")

        if choice == "1":
                    en = encrypt(flag, key[:key_len])
                    result = binascii.hexlify(en.encode())
                    print (result)
        elif choice == "2":
            length = input("key len: ")

            try:
                int(length)

                if int(length) < 8:
                    print ("invalid")
                else:
                    key_len = int(length)
                    print ("Success")
            except:
                print ("invalid")
        elif choice == "3":
            break
        else:
            print ("invalid")
main()

간단히 key와 flag를 XOR 연산하는 함수이다. key의 length를 작게 잡으면 key는 반복되므로 취약하다. flag의 처음 부분이 HACKCTF{ 라는 것을 이용하면 쉽게 key를 알아낼 수 있다.

Exploit Code

from Crypto.Util.number import *

enc = long_to_bytes(0x7d54535b7567201e6d05626f074039335047496f6056141c6a664442574404004747496f5307151c14144d3a)
flag = 'HackCTF{'

key_8 = ''
for i in range(0, 8):
    key_8 += chr(ord(enc[i])^ord(flag[i]))

real_flag = ''
for i in range(0, len(enc)):
    real_flag += chr(ord(enc[i])^ord(key_8[i%8]))

print real_flag

'Writeup [crypto] > HackCTF' 카테고리의 다른 글

XOR  (0) 2020.03.08
HelloCryto  (0) 2020.03.08

+ Recent posts