#!/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 |