Dreamhack/Dreamhack Wargame (Challenge)

[75] IT 비전공자 [dreamhack]SingleByteXor문제 풀기

imaginefuture-1 2024. 11. 23. 08:59

내가 좋아하는 끄립또

 

 

 

 

한번 궁금해서 지피티한테 물어봤는데...

지피티는...신인가..?

 

 

 

# Let's decrypt the given ciphertext using XOR brute force for single-byte key

# Given hexadecimal ciphertext
hex_cipher = "54586b6458754f7b215c7c75424f21634f744275517d6d"

# Convert the hex string to bytes
cipher_bytes = bytes.fromhex(hex_cipher)

# Brute force single-byte XOR keys
possible_flags = []

for key in range(256):  # Single byte keys range from 0 to 255
    decrypted_bytes = bytes([byte ^ key for byte in cipher_bytes])  # XOR decryption
    try:
        # Attempt to decode as UTF-8, valid flag should be printable
        decrypted_text = decrypted_bytes.decode('utf-8')
        if decrypted_text.startswith("DH{") and decrypted_text.endswith("}"):
            possible_flags.append(decrypted_text)
    except UnicodeDecodeError:
        # Ignore non-decodable results
        continue

possible_flags

 

크립이의 문제를 해결했습니다! 플래그는 다음과 같습니다:

DH{tHe_k1LleR_1s_dReAm}

이로써 범인을 밝혀낼 수 있겠네요! 🕵️‍♀️ ​

 


 

 

역풀이가자 

 

 

 

문제 풀이: XOR 암호 해독

문제는 다음과 같은 구조로 주어졌습니다:

  • 주어진 암호문: 54586b6458754f7b215c7c75424f21634f744275517d6d (16진수)
  • 암호화 방식: 단일 바이트와의 XOR
  • 플래그 형태: DH{message}

1. 암호문의 분석

주어진 암호문은 16진수로 제공되었으므로, 이를 해독하기 위해 먼저 바이트(bytes) 형식으로 변환해야 합니다.

암호문:
54586b6458754f7b215c7c75424f21634f744275517d6d
를 바이트로 변환하면:

cipher_bytes = bytes.fromhex("54586b6458754f7b215c7c75424f21634f744275517d6d")

 

bytes.fromhex 16진수를 바이트 형식으로 변환


2. 단일 바이트 XOR 방식

단일 바이트 XOR는 다음 규칙을 따릅니다:

  1. 암호화된 각 바이트는 평문(plain text) 바이트와 키(key) 바이트 간의 XOR 연산으로 생성됩니다.
  2. XOR의 특징:
    • 동일한 값을 두 번 XOR하면 원래 값이 복원됨.
      • 즉, EncryptedByte ^ Key ^ Key = PlainByte

이를 통해 암호화에 사용된 단일 바이트 키를 찾아낼 수 있습니다.

 

 

key^cipher_bytes를 16진수한게 저거니까

cipher_bytes를 역 xor


3. 브루트 포스 해독

단일 바이트 키는 256가지(0~255) 값 중 하나이므로, 모든 키 값을 시도해 볼 수 있습니다:

  • 각 키에 대해 암호문을 XOR 연산으로 평문으로 복원.
  • 복원된 텍스트가 플래그 형태(DH{...})를 만족하는지 확인.

단일 바이트 키는 0000 0000 ~ 1111 1111 경우의수는 (0~255)십진수로 총 256가지

즉 전부 대입하는 brute force사용

그리고 복원된 텍스트 형식은 DH{}인걸 찾아줘

 

코드 구현:

for key in range(256):
    decrypted_bytes = bytes([byte ^ key for byte in cipher_bytes])  # XOR 복호화
    try:
        decrypted_text = decrypted_bytes.decode('utf-8')  # UTF-8 디코딩
        if decrypted_text.startswith("DH{") and decrypted_text.endswith("}"):
            print(f"Key: {key}, Decrypted Text: {decrypted_text}")
    except UnicodeDecodeError:
        continue

 

 

복호화 바이트를 FLAG 형식에 맞게 찾기 위해선 UTF_8 디코딩

없다면 ERROR

 

4. 결과

브루트 포스 해독 결과:

Key: 35
Decrypted Text: DH{tHe_k1LleR_1s_dReAm}

암호화 키는 0x35 (10진수로 53)입니다.
이 키를 사용해 XOR 연산을 수행하면 평문이 복구되었고, 플래그는 **DH{tHe_k1LleR_1s_dReAm}**입니다.


 

키는 10진수로 53이었음. DH{tHe_k1LIeR_1s_dReAm}^53(0x35)하고 16진수로 변환한 값이=  54586b6458754f7b215c7c75424f21634f744275517d6d 

 

5. 해석

이 문제는 XOR 암호화의 기본 원리를 이해하고, 단일 바이트 키에 대해 브루트 포스를 수행해 암호문을 복호화하는 과정을 묻는 문제였습니다.

결론적으로:

  • 범인은 Dream입니다! 😊