Dreamhack/Dreamhack Wargame (Challenge)

[153] IT 비전공자 [dreamhack]INVERSE문제 풀기

imaginefuture-1 2025. 2. 10. 09:22

 

encrypt.py파일이다

 

import urllib.parse


aldknadvlknadvlanaldknadvlknadvlanaldknadvlknadvlanaldknadvlknadvlanaldknadvlknadvlanaldknadvlknadvlanaldknadvlknadvlanaldknadv_KEY = {
    'A': 'Q', 'B': 'W', 'C': 'E', 'D': 'R', 'E': 'T', 'F': 'Y', 'G': 'U', 'H': 'I', 'I': 'O',
    'J': 'P', 'K': 'A', 'L': 'S', 'M': 'D', 'N': 'F', 'O': 'G', 'P': 'H', 'Q': 'J', 'R': 'K',
    'S': 'L', 'T': 'Z', 'U': 'X', 'V': 'C', 'W': 'V', 'X': 'B', 'Y': 'N', 'Z': 'M',
    'a': 'q', 'b': 'w', 'c': 'e', 'd': 'r', 'e': 't', 'f': 'y', 'g': 'u', 'h': 'i', 'i': 'o',
    'j': 'p', 'k': 'a', 'l': 's', 'm': 'd', 'n': 'f', 'o': 'g', 'p': 'h', 'q': 'j', 'r': 'k',
    's': 'l', 't': 'z', 'u': 'x', 'v': 'c', 'w': 'v', 'x': 'b', 'y': 'n', 'z': 'm',
}

def aldknadvlknadvlanaldknadvlknadvlanaldknadvlknadvlanaldknadvlknadvlanaldknadvlknadvlanaldknadvlknadvlanaldknadvlknadvlanaldknadv_encrypt(data, key):
    return ''.join(key.get(char, char) for char in data)

def adsoaisjcoiansvoiasnvaoisbaoivadsoaisjcoiansvoiasnvaoisbaoivadsoaisjcoiansvoiasnvaoisbaoivadsoaisjcoiansvoiasnvaoisbaoivadsoais(data):
    return urllib.parse.quote(data)

def encrypt(plaintext):
    substituted = aldknadvlknadvlanaldknadvlknadvlanaldknadvlknadvlanaldknadvlknadvlanaldknadvlknadvlanaldknadvlknadvlanaldknadvlknadvlanaldknadv_encrypt(plaintext, aldknadvlknadvlanaldknadvlknadvlanaldknadvlknadvlanaldknadvlknadvlanaldknadvlknadvlanaldknadvlknadvlanaldknadvlknadvlanaldknadv_KEY)
    final_encrypted = adsoaisjcoiansvoiasnvaoisbaoivadsoaisjcoiansvoiasnvaoisbaoivadsoaisjcoiansvoiasnvaoisbaoivadsoaisjcoiansvoiasnvaoisbaoivadsoais(substituted)
    return final_encrypted

if __name__ == "__main__":
    plaintext = "0xH0P3{Fake_Flag}"
    encrypted = encrypt(plaintext)
    with open("encrypted.txt", "w") as f:
        f.write(encrypted)

 

에?

뒤..집어야하는거죠?

 

encrypted.txt 파일이다

0bI0H3%7BEknhzg_1l_Yxf_i4i4%7D

 

음..뒤집어도...아닌데? ㅋㅋㅋㅋㅋㅋ

aldknadvlknadvlanaldknadvlknadvlanaldknadvlknadvlanaldknadvlknadvlanaldknadvlknadvlanaldknadvlknadvlanaldknadvlknadvlanaldknadv_KEY

 

 

aldknadvlknadvlan 반복됨..

 

 

🔍 코드 한 줄씩 설명

이 코드는 암호화된 문자열을 복호화하여 원래의 플래그를 얻는 역할을 합니다.
암호화 과정이 1️⃣ 치환 암호 (Substitution Cipher) + 2️⃣ URL 인코딩이므로, 복호화 과정은 이를 반대로 수행해야 합니다.


1️⃣ 복호화 키 생성 (decryption_key)

decryption_key = {v: k for k, v in {
    'A': 'Q', 'B': 'W', 'C': 'E', 'D': 'R', 'E': 'T', 'F': 'Y', 'G': 'U', 'H': 'I', 'I': 'O',
    'J': 'P', 'K': 'A', 'L': 'S', 'M': 'D', 'N': 'F', 'O': 'G', 'P': 'H', 'Q': 'J', 'R': 'K',
    'S': 'L', 'T': 'Z', 'U': 'X', 'V': 'C', 'W': 'V', 'X': 'B', 'Y': 'N', 'Z': 'M',
    'a': 'q', 'b': 'w', 'c': 'e', 'd': 'r', 'e': 't', 'f': 'y', 'g': 'u', 'h': 'i', 'i': 'o',
    'j': 'p', 'k': 'a', 'l': 's', 'm': 'd', 'n': 'f', 'o': 'g', 'p': 'h', 'q': 'j', 'r': 'k',
    's': 'l', 't': 'z', 'u': 'x', 'v': 'c', 'w': 'v', 'x': 'b', 'y': 'n', 'z': 'm',
}.items()}

✔ aldknadvlknadv_KEY (암호화 키)를 뒤집어서 복호화 키를 생성
암호화된 문자를 원래 문자로 변환하는 역할
✔ dict.items()를 사용해 키-값을 거꾸로 매핑하여 만든 것

🛠 예시

원본 문자 암호화된 문자 복호화 키 (거꾸로)

A Q Q → A
B W W → B
C E E → C
... ... ...
t z z → t
u x x → u

2️⃣ 복호화 함수 (decrypt())

def decrypt(encrypted_text):
    # 1. URL 디코딩
    decoded_text = urllib.parse.unquote(encrypted_text)

    # 2. 치환 복호화
    decrypted_text = ''.join(decryption_key.get(char, char) for char in decoded_text)
    
    return decrypted_text

URL 디코딩 (unquote) 수행
복호화 키(decryption_key)를 사용하여 원래 문자로 변환

🛠 예제 🔹 암호화된 텍스트: "0bI0H3%7BEknhzg_1l_Yxf_i4i4%7D"
🔹 1단계: URL 디코딩 (urllib.parse.unquote)

0bI0H3{Eknhzg_1l_Yxf_i4i4}

🔹 2단계: 치환 복호화 (decryption_key.get(char, char))

0xH0P3{Crypto_1s_Fun_h4h4}

3️⃣ 복호화 실행

encrypted_example = "0xH0P3%7BFqkt_Ftqz%7D"
decrypted_flag = decrypt(encrypted_example)

✔ encrypted_example → 암호화된 플래그
✔ decrypt() 함수 실행 → 복호화된 원본 플래그 반환


🎯 코드 흐름 요약

1️⃣ aldknadvlknadv_KEY를 거꾸로 뒤집어 복호화 키(decryption_key) 생성
2️⃣ URL 인코딩된 텍스트를 urllib.parse.unquote()로 디코딩
3️⃣ decryption_key를 이용해 문자를 원래 상태로 변환
4️⃣ 복호화된 플래그 출력

결과: "0xH0P3{Crypto_1s_Fun_h4h4}" 🎉


🚀 결론

암호화 과정: 치환 암호(문자 대체) + URL 인코딩
복호화 과정: URL 디코딩 → 치환 역변환
이 방식으로 암호화된 모든 문자열을 복호화 가능! 🔥

 

 

🔍 코드 분석: decrypted_text = ''.join(decryption_key.get(char, char) for char in decoded_text)

이 한 줄의 코드에서 수행하는 작업을 단계별로 설명하겠습니다.


🚀 1️⃣ 코드의 역할

이 코드는 URL 디코딩된 문자열 (decoded_text)을 복호화된 문자열 (decrypted_text)로 변환하는 과정입니다.

✔ decoded_text에는 URL 디코딩된 암호화된 문자열이 들어있음
각 문자를 decryption_key를 사용해 원래 문자로 변환
모든 변환된 문자들을 합쳐서 원래 문자열로 복구


🛠 2️⃣ 코드 구조

decrypted_text = ''.join(decryption_key.get(char, char) for char in decoded_text)

✔ for char in decoded_text → decoded_text 문자열을 한 글자씩 반복
✔ decryption_key.get(char, char) →

  • 치환 키 (decryption_key)에서 해당 문자의 원래 값을 찾음
  • 찾을 수 없으면 원래 문자 그대로 유지 ✔ ''.join(...) → 변환된 문자들을 하나의 문자열로 합침

📌 3️⃣ 동작 방식 예제

📍 예제 입력

decoded_text = "Fqkt_Ftqz"

✔ 이 문자열은 aldknadvlknadv_KEY로 암호화된 플래그 일부
✔ decryption_key를 이용해 복호화할 수 있음


📍 1️⃣ for char in decoded_text (한 글자씩 반복)

문자 'F' → 변환
문자 'q' → 변환
문자 'k' → 변환
문자 't' → 변환
문자 '_' → 변환 안 함 (원래 값 유지)
문자 'F' → 변환
문자 't' → 변환
문자 'q' → 변환
문자 'z' → 변환

📍 2️⃣ decryption_key.get(char, char) 변환 과정

입력 문자 (char) decryption_key.get(char, char) 결과

FY  
qj  
ka  
tz  
_ → _ (변환 없음)  
FY  
tz  
qj  
zt  

📍 3️⃣ ''.join(...) 변환된 문자 합치기

"Fqkt_Ftqz"  →  "Yjaz_Yzjt"

복호화된 문자열이 완성됨!


🎯 결론

문자 하나씩 반복 (for char in decoded_text)
치환 키 (decryption_key.get(char, char))를 사용하여 복호화
변환된 문자들을 하나로 합쳐 원래 문장을 복구 (''.join(...))

결과적으로, 암호화된 문자열을 원래 상태로 되돌리는 핵심 코드! 🚀

 

 

import urllib.parse

# 암호화 키를 뒤집어 복호화 키 생성
decryption_key = {v: k for k, v in {
    'A': 'Q', 'B': 'W', 'C': 'E', 'D': 'R', 'E': 'T', 'F': 'Y', 'G': 'U', 'H': 'I', 'I': 'O',
    'J': 'P', 'K': 'A', 'L': 'S', 'M': 'D', 'N': 'F', 'O': 'G', 'P': 'H', 'Q': 'J', 'R': 'K',
    'S': 'L', 'T': 'Z', 'U': 'X', 'V': 'C', 'W': 'V', 'X': 'B', 'Y': 'N', 'Z': 'M',
    'a': 'q', 'b': 'w', 'c': 'e', 'd': 'r', 'e': 't', 'f': 'y', 'g': 'u', 'h': 'i', 'i': 'o',
    'j': 'p', 'k': 'a', 'l': 's', 'm': 'd', 'n': 'f', 'o': 'g', 'p': 'h', 'q': 'j', 'r': 'k',
    's': 'l', 't': 'z', 'u': 'x', 'v': 'c', 'w': 'v', 'x': 'b', 'y': 'n', 'z': 'm',
}.items()}

# 복호화 함수 정의
def decrypt(encrypted_text):
    # 1. URL 디코딩
    decoded_text = urllib.parse.unquote(encrypted_text)

    # 2. 치환 복호화
    decrypted_text = ''.join(decryption_key.get(char, char) for char in decoded_text)
    
    return decrypted_text

# 암호화된 텍스트 입력 (예제)
encrypted_example = "0xH0P3%7BFqkt_Ftqz%7D"  # 이 값을 실제 문제에서 주어진 값으로 변경해야 함

# 복호화 실행
decrypted_flag = decrypt(encrypted_example)
decrypted_flag
0xH0P3{Crypto_1s_Fun_h4h4}