문제 이름이 오타인 거 같긴하다.
import base64
from Crypto.Util.strxor import strxor
key = "****"
message = "****"
assert len(key) == 14
strxor_key = "HelloCrypto"
strxor_key = (strxor_key * (len(message) / len(strxor_key) + 1))[:len(message)]
message = strxor(message, strxor_key)
message += key
cipher = ''
for i in range(0, len(message)):
cipher += chr((ord(message[i]) + ord(key[i % len(key)]) + 0xDEADBEEF) % 128)
print base64.b64encode(cipher.encode("hex"))
먼저 message를 "HelloCrypto"와 XOR 연산을 하고 key를 뒤에 붙여준다.
이 또한 flag가 HackCTF{
를 이용한다는 것을 이용하면 key의 8자리를 알아낼 수 있다.
그 후에도 key의 뒷자리를 알아낼 수 있다.
Exploit Code
import base64
from Crypto.Util.strxor import strxor
from Crypto.Util.number import *
cipher = long_to_bytes(0x201e30215031561c52203664317d537851472e5a4d241b3035796e0f7f4d442b304f534551455557534c50455257554c)
# 1. Remove 0xDEADBEEF
cipher_new = ''
for i in range(0, len(cipher)):
cipher_new += chr((ord(cipher[i])-0xDEADBEEF)%128)
# 2. Find the Key
flag = "HackCTF{"
flag_xor = strxor(flag, "HelloCry")
key_0to7 = ''
for i in range(0, len(flag_xor)):
key_0to7 += chr((ord(cipher_new[i])-ord(flag_xor[i]))%128)
key_6to13 = ''
for i in range(0, 8):
key_6to13 += chr((ord(cipher_new[i+34])-ord(key_0to7[i]))%128)
key = key_0to7+key_6to13[2:]
# 3. Capture the Flag
message = ''
for i in range(0, len(cipher_new)):
message += chr((ord(cipher_new[i])-ord(key[i % len(key)]))%128)
message = message[:-14]
strxor_key = "HelloCrypto"
strxor_key = (strxor_key * (len(message) / len(strxor_key) + 1))[:len(message)]
print strxor_key
message = strxor(message, strxor_key)
print message
'Writeup [crypto] > HackCTF' 카테고리의 다른 글
XOR (0) | 2020.03.08 |
---|---|
babyXOR (0) | 2020.03.08 |