한번 궁금해서 지피티한테 물어봤는데...
지피티는...신인가..?
# 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는 다음 규칙을 따릅니다:
- 암호화된 각 바이트는 평문(plain text) 바이트와 키(key) 바이트 간의 XOR 연산으로 생성됩니다.
- XOR의 특징:
- 동일한 값을 두 번 XOR하면 원래 값이 복원됨.
- 즉, EncryptedByte ^ Key ^ Key = PlainByte
- 동일한 값을 두 번 XOR하면 원래 값이 복원됨.
이를 통해 암호화에 사용된 단일 바이트 키를 찾아낼 수 있습니다.
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입니다! 😊
'Dreamhack > Dreamhack Wargame (Challenge)' 카테고리의 다른 글
헤헷헤헷헤헷 드림핵 1000등 (0) | 2024.11.24 |
---|---|
[76] IT 비전공자 [dreamhack]broken-png문제 풀기 (1) | 2024.11.24 |
[74] IT 비전공자 [dreamhack]Apache htaccess문제 풀기 (0) | 2024.11.22 |
[73] IT 비전공자 [dreamhack]File Vulnerability Advanced for linux문제 풀기 (1) | 2024.11.21 |
[72] IT 비전공자 [dreamhack]Secure Mail문제 풀기 (2) | 2024.11.20 |