채영채영 2023. 11. 8. 12:46

https://dreamhack.io/wargame/challenges/852

 

ROT128

Description rot128.py는 flag.png 파일을 암호화하여 encfile로 저장하는 프로그램의 소스 코드입니다. (풀이자가 프로그램을 직접 실행할 수는 없습니다.) 주어진 encfile을 복호화하여 flag 파일 내용을 알

dreamhack.io

문제에서 encfile을 복호화 하라고 한다. 알 수 없는 숫자가 있다. 위에 코드를 보면 utf-8로 인코딩 되어있다고 한다. 

 

plain_list는 평문이 hex로 파싱된 list인데, 3줄을 보면, 0부터 1씩 증가하는 hex 리스트인것을 볼 수 있다. 

그리고 flag.png는 우리가 복호화해야할 평문의 원본이다. 

12줄에서 판단할 수 있는 것은, 암호문이 카이사르 암호라는 것이다. hex로 파싱된 평문을 순회하면서 hex_list를 참조해 128만큼 뒤로 밀어 치환하는 원리이다. 반대로 복호화 하려면 128만큼 앞당겨야한다. 

복호화 코드를 작성해보자. 시간 절약을 위해 gpt를 사용하여 작성하겠다. 

#!/usr/bin/env python3

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

# 암호화에 사용된 hex_list 생성
hex_list = [(hex(i)[2:].zfill(2).upper()) for i in range(256)]

# 암호화된 문자열을 128만큼 앞으로 이동하여 복호화
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)]

# 복호화된 리스트를 다시 바이트로 변환
decoded_bytes = bytes.fromhex(''.join(dec_list))

# 복호화된 내용을 파일로 저장
with open('decoded_flag.png', 'wb') as f:
    f.write(decoded_bytes)

print("복호화가 완료되었습니다.")

파일을 flag형식에 맞게 코드를 수정해주겠다.

#!/usr/bin/env python3

# 암호화에 사용된 hex_list 생성
hex_list = [(hex(i)[2:].zfill(2).upper()) for i in range(256)]

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

# 암호화된 문자열을 2자리씩 나눠 리스트로 변환
enc_list = [enc_list[i:i+2] for i in range(0, len(enc_list), 2)]

# 복호화된 데이터를 저장할 리스트
plain_list = list(range(len(enc_list)))

# 암호문을 복호화
for i in range(len(enc_list)):
    hex_b = enc_list[i]
    index = hex_list.index(hex_b)
    plain_list[i] = hex_list[(index - 128) % len(hex_list)]

# 복호화된 리스트를 바이트로 변환
plain_s = bytes.fromhex(''.join(plain_list))

# 복호화된 내용을 파일로 저장
with open('flag.png', 'wb') as f:
    f.write(plain_s)

print("done.")