λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
βœ’οΈ Cryptography/Dreamhack

[Dreamhack] SingleByteXor λ“œλ¦Όν•΅ μ›Œκ²Œμž„ 문제 풀이

by A Lim Han 2023. 8. 18.

🐞 SingleByteXor λ“œλ¦Όν•΅ μ›Œκ²Œμž„ λ¬Έμ œ ν’€μ΄

1.  λ¬Έμ œμ— λŒ€ν•œ μ„€λͺ… μˆ™μ§€ (문제 νŒŒμΌμ€ 별도 λ‹€μš΄λ‘œλ“œ ν•„μš” X)

 

++  XOR(Exclusive OR) μ•”ν˜Έλž€?

XOR(Exclusive OR) μ•”ν˜Έλ²•μ€ 두 λΉ„νŠΈλ‚˜ 뢈(Boolean) 값이 λ‹€λ₯Ό λ•Œ 1, 같을 λ•Œ 0을 λ°˜ν™˜ν•˜λŠ” "배타적 논리합" 연산을 μ‚¬μš©ν•˜μ—¬ 데이터λ₯Ό μ•”ν˜Έν™”ν•˜λŠ” κ°„λ‹¨ν•œ μ•”ν˜Έν™” 기법이닀.

XOR(Exclusive OR) 연산은 각 데이터 λΉ„νŠΈμ™€ μ•”ν˜Έν™” ν‚€ λΉ„νŠΈ κ°„ 연산을 μˆ˜ν–‰ν•˜λŠ” λ°©μ‹μœΌλ‘œ λ™μž‘ν•˜λ©°, 각 λΉ„νŠΈμ— λŒ€ν•΄ μ•”ν˜Έν™” ν‚€μ˜ ν•΄λ‹Ή λΉ„νŠΈμ™€ XOR 연산을 μˆ˜ν–‰ν•˜λ©΄ μ•”ν˜Έλ¬Έμ΄ μƒμ„±λœλ‹€.
λ³΅ν˜Έν™”μ˜ 경우 λ™μΌν•œ ν‚€λ₯Ό 톡해 연산을 μΆ”κ°€ μˆ˜ν–‰ν•¨μœΌλ‘œμ¨ 얻을 수 μžˆλ‹€.

2.  λ³΅ν˜Έν™”λ₯Ό μœ„ν•œ Python 슀크립트 μž‘μ„±


  
hex_value = "54586b6458754f7b215c7c75424f21634f744275517d6d"
decoded_hex = bytes.fromhex(hex_value)
possible_messages = []
for key in range(256):
decoded_message = bytes([byte ^ key for byte in decoded_hex])
possible_messages.append(decoded_message)
for message in possible_messages:
print(message.decode("utf-8", errors="ignore"))

 

 

++ κ°€λŠ₯ν•œ λͺ¨λ“  단일 λ°”μ΄νŠΈ κ°’(0x00λΆ€ν„° 0xFF)에 λŒ€ν•΄ XOR 연산을 μˆ˜ν–‰ν•˜μ—¬ 평문 탐색

β‘   hex_value λ³€μˆ˜μ— μ•”ν˜Έν™”λœ ν—₯μŠ€κ°’μ΄ ν• λ‹Ή

β‘‘  bytes.fromhex() ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ μ•”ν˜Έν™”λœ ν—₯μŠ€κ°’μ„ λ°”μ΄νŠΈλ‘œ λ³€ν™˜

β‘’  λ³€ν™˜ν•œ 값을 decoded_hex λ³€μˆ˜μ— μ €μž₯

β‘£  0λΆ€ν„° 255κΉŒμ§€μ˜ λͺ¨λ“  값을 λ°˜λ³΅ν•˜λ©° XOR μ•”ν˜Έν™”λœ 값을 ν•΄λ‹Ή κ°’μœΌλ‘œ λ³΅ν˜Έν™”

β‘€  λ³΅ν˜Έν™”ν•œ 값을 decoded_message λ³€μˆ˜μ— μ €μž₯

β‘₯  possible_messages λ¦¬μŠ€νŠΈμ— λͺ¨λ“  λ³΅ν˜Έν™” λ©”μ‹œμ§€ μΆ”κ°€

⑦  possible_messages 리슀트의 λͺ¨λ“  λ©”μ‹œμ§€μ— λŒ€ν•΄ UTF-8 ν˜•μ‹μœΌλ‘œ λ””μ½”λ”©ν•˜μ—¬ 좜λ ₯

3.  μž‘μ„±ν•œ Python 슀크립트 μ‹€ν–‰  -->  15번째 μ€„μ—μ„œ FLAG 발견

4.  λ‹€μ‹œ 문제 νŽ˜μ΄μ§€λ‘œ λŒμ•„μ™€ λ°œκ²¬ν•œ FLAG μž…λ ₯

상단 이미지 좜처: https://blog.opendocs.co.kr/?p=209