문제 이름이 오타인 거 같긴하다.

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

+ Recent posts