어느날, 살인사건이 일어났다. 살인 사건의 유일한 증거물은 쓰여있는 쪽지에는, 다음과 같이 적혀있었다. 54586b6458754f7b215c7c75424f21634f744275517d6d 크립이에게 주어진 단서는, 쪽지의 내용과 이것이 어떤 단일바이트와 XOR해서 만들어진 암호라는 단서 뿐. 과연 크립이는 범인을 찾을 수 있을 것인가..!
flag 타입은 DH{message}입니다
문제 풀이
단일 바이트와 XOR해서 만들어진 암호라는 것을 보고 ChatGPT한테 단일 바이트 XOR 복호화 코드를 짜달라고 했다 ㅎㅎ;
CHAT GPT : 이 코드를 사용하려면 ciphertext 변수에 해독하고자 하는 암호문을 바이트 형태로 입력해야 합니다. 예를 들어, 암호문이 16진수로 인코딩된 문자열이라면 bytes.fromhex 메서드를 사용하여 바이트로 변환할 수 있습니다. 코드를 실행하면 각 키로 복호화된 결과를 출력합니다. 가장 의미 있는 평문을 찾으면 해당 키를 사용하여 암호문을 해독할 수 있습니다.
def xor_decrypt(ciphertext, key):
return bytes([b ^ key for b in ciphertext])
def single_byte_xor_brute_force(ciphertext):
candidates = []
for key in range(256):
decrypted = xor_decrypt(ciphertext, key)
try:
decrypted_text = decrypted.decode('utf-8')
candidates.append((key, decrypted_text))
except UnicodeDecodeError:
# Ignore non-decodable results
pass
return candidates
# Example usage
ciphertext = bytes.fromhex('54586b6458754f7b215c7c75424f21634f744275517d6d')
candidates = single_byte_xor_brute_force(ciphertext)
for key, text in candidates:
print(f'Key: {key} - Decrypted Text: {text}')
이 코드를 실행시키면
이렇게 결과값들이 주르륵 뜨는데 처음엔 무지성으로 내리다가 dh가 보여서 이건 줄 알고 flag 값으로 변경해서
답에 넣어봤지만 실패
그래서 처음부터 다시 천천히 내리면서 확인했더니 플래그 값이 있는 것을 확인할 수 있었다.
더 나은 코드를 알아왔다.
일단 16진수라 0x54, 0x58, ... 등으로 잘라서 사용 하는데
플래그다 보니 DH로 시작하는 결과를 찾고 그 결과를 출력하는 코드를 짜면 되는것 !!
from pwn import *
a = bytes.fromhex("54586b6458754f7b215c7c75424f21634f744275517d6d")
for i in range(0,0xFF):
res = xor(a, i)
if res.startswith(b"DH"): #b"DH" 인 이유는 바이트 배열이기 때문
print(res)
break