문제풀이

[Dreamhack] ROT128 문제풀이

suuuullloc 2024. 1. 23. 23:51

# 문제링크 : https://dreamhack.io/wargame/challenges/852

 

ROT128

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

dreamhack.io


 

문제 파일

 

코드를 한 번 살펴보자.

 

코드를 해석해보자면

#!/usr/bin/env python3

# 0부터 255까지의 값을 16진수로 변환하여 두 자리씩 리스트에 저장
hex_list = [(hex(i)[2:].zfill(2).upper()) for i in range(256)]

# 'flag.png' 파일을 이진 모드로 열어서 파일의 내용을 읽어옴
with open('flag.png', 'rb') as f:
    plain_s = f.read()

# 각 바이트를 16진수로 변환하여 두 자리씩 리스트에 저장
plain_list = [hex(i)[2:].zfill(2).upper() for i in plain_s]

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

# 각 바이트에 대해 128만큼 시프트된 값을 계산하여 암호화 수행
for i in range(len(plain_list)):
    hex_b = plain_list[i]
    index = hex_list.index(hex_b)
    enc_list[i] = hex_list[(index + 128) % len(hex_list)]

# 암호화된 데이터를 문자열로 변환
enc_list = ''.join(enc_list)

# 'encfile' 파일을 UTF-8 인코딩으로 열고, 암호화된 데이터를 파일에 씀
with open('encfile', 'w', encoding='utf-8') as f:
    f.write(enc_list)

이렇게 정리할 수 있다.

 

코드 해석은 끝났고 이제 이 코드를 디코딩해야 한다. 디코딩은 자고로 인코딩을 거꾸로 하면 된다. 맞는 코드를 짜보자.

#!/usr/bin/env python3

# 0부터 255까지의 값을 16진수로 변환하여 리스트에 저장
hex_list = [(hex(i)[2:].zfill(2).upper()) for i in range(256)]

# 'encfile' 파일을 열어서 암호화된 데이터를 읽어옴
with open('encfile', 'r', encoding='utf-8') as f:
    enc_list = f.read()

# 암호화된 데이터를 리스트로 변환
enc_list = [enc_list[i:i+2] for i in range(0, len(enc_list), 2)]

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

# 각 암호화된 바이트에 대해 128만큼 시프트된 값을 계산하여 복호화 수행
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))

# flag.png' 파일을 이진 모드로 열고, 복호화된 데이터를 파일에 씀
with open('flag.png', 'wb') as f:
    f.write(plain_s)

이런 식으로 코드를 짜볼 수 있다. 순서를 거꾸로 하는 게 중요하다.

 

이 코드로 파일을 만들어서 실행하면 이런식으로 flag.png가 생긴다.

 

들어가보면 이렇게 플래그가 적혀있는 걸 볼 수 있다.

 

문제 해결!

 

+) 와... 정말 너무 어렵다. 다른 풀이들 참고 안했으면 못 풀었을 것 같다. 만만하게 봤다가 큰 코 다쳤다... 이게 새싹 단계? 암호학 문제는 함부로 건드리지 못할 것 같다...