⛳ CTF/✅ DreamHack

[DreamHack] 01. LEVEL1 > SingleByteXor

sa1t 2024. 6. 17. 14:56
반응형

문제 설명
더보기

어느날, 살인사건이 일어났다.
살인 사건의 유일한 증거물은 쓰여있는 쪽지에는, 다음과 같이 적혀있었다.
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

 

반응형