Dreamhack/Dreamhack Wargame (Challenge)

[27] IT 비전공자 [dreamhack] ROT128문제 풀기

imaginefuture-1 2024. 10. 6. 08:27

짜잔 27번째 문제다 가보자구!

 

 

문제다

 

rot128에 대해서 물어봤다 영어로 나와서 한글로 번역하니 문맥이 매끄럽지 못하다

 

13자리씩 이동하는 암호화 코드라고한다.

복호화는 암호화 반대이기에 13씩 이동했던 자리를 다시 되돌아오면 된다.

 

코드를 보자 

 

 

#!/usr/bin/env python3

hex_list = [(hex(i)[2:].zfill(2).upper()) for i in range(256)]

with open('encfile', 'r', encoding='utf-8') as f:
    encrypted_text = f.read()
    
hex_list = [(hex(i)[2:].zfill(2).upper()) for i in range(256)]
enc_pairs = [encrypted_text[i:i+2] for i in range(0, len(encrypted_text), 2)]
dec_list = list(range(len(enc_pairs)))

for i in range(len(enc_pairs)):
    hex_b = enc_pairs[i]
    index = hex_list.index(hex_b)
    dec_list[i] = hex_list[(index - 128)]

dec_ = bytes([int(b, 16) for b in dec_list])

with open('decrypted_flag.png', 'wb') as f:
    f.write(dec_)

 

gpt에게 코드 설명을 해달라했다.

흠 128만큼 이동했다니까 -128을 대충 하면 되지않을까 생각하는데

 

복호화 코드를 새로 짜야할 것 같았다...

 

하지만 나는 응애인걸..

 

gpt에게 encfile 복호화 해달라했다 

 

 

hex_list = [(hex(i)[2:].zfill(2).upper()) for i in range(256)]

# 암호화된 파일 읽기
with open('encfile', 'r', encoding='utf-8') as f:
    enc_data = f.read()

# 2글자씩 쪼개서 리스트로 변환
enc_list = [enc_data[i:i+2] for i in range(0, len(enc_data), 2)]

# 복호화 리스트 생성
dec_list = list(range(len(enc_list)))

for i in range(len(enc_list)):
    hex_b = enc_list[i]
    index = hex_list.index(hex_b)
    dec_list[i] = hex_list[(index - 128) % len(hex_list)]

# 복호화된 데이터를 바이너리로 변환
dec_bytes = bytes([int(b, 16) for b in dec_list])

# 복호화된 파일을 저장
with open('decrypted_flag.png', 'wb') as f:
    f.write(dec_bytes)

 

지피티는 신인가?

 

일단 복호화 과정은 암호화랑 동일하다.

1. 암호화된 파일을 읽어와

2. 2글자씩 쪼개서 리스트로 변환 (요부분은 자세히 모르겠다) 바이너리 때문인 것 같은데..흐음

3. 복호화 리스트 생성 (암호화 리스트 생성 반대)

4. 128가는걸 반대로 128 - (되돌아감)

5. 복호화된 데이터를 바이너리로 변환 (바이너리 모드로 읽었으니까)

6. 복호환 된 파일 저장

 

그러면 바탕화면에 짜잔 사진 파일이 생성되고 눌러보면

 

 

 

어라?