본문 바로가기
CTF/Dreamhack

[Dreamhack] ROT128

by 8희 2023. 11. 8.

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

 

ROT128

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

dreamhack.io

 

encfile을 복호화하여 flag 파일 내용을 알아낸 뒤, flag.png에서 플래그를 알아내는 문제이다.

 

 

encfile을 복호화하기 위해서 rot128.py를 확인했다.

rot128.py는 flag.file을 암호화하여 encfile로 저장하는 파일이다.

 

#!/usr/bin/env python3

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

# 'flag.png' 파일을 바이너리 읽기 모드로 열고, 해당 파일을 plain_s에 저장
with open('flag.png', 'rb') as f:
    plain_s = f.read()

# plain_s의 각 요소를 16진수로 변환하여 plain_list에 저장
plain_list = [hex(i)[2:].zfill(2).upper() for i in plain_s]

# plain_list와 동일한 길이를 가진 enc_list 만들기
enc_list = list(range(len(plain_list)))

# 각 plain_list의 항목을 가져와서 해당 항목이 hex_list에서의 인덱스 찾기
# 그 후 128을 더한 뒤 hex_list의 길이로 나눈 나머지를 사용해서 enc_list에 저장
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의 모든 요소를 문자열로 결합, 'encfile'이라는 파일에 UTF-8 인코딩으로 쓰기
enc_list = ''.join(enc_list)
with open('encfile', 'w', encoding='utf-8') as f:
    f.write(enc_list)

 

코드를 분석하면 이와 같다. 

 

 

이 부분을 통해 카이사르 암호를 사용한다는 것을 알 수 있다.

평문을 128이라는 일정한 거리만큼 뒤로 밀어서 치환하고 있기 때문이다.

 

따라서 복호화 하기 위해서는 다시 128만큼 앞으로 밀면 된다.

 

 

복호화 코드는 이와 같다.

 

 

flag.png에서 플래그를 확인할 수 있다!

 

'CTF > Dreamhack' 카테고리의 다른 글

[Dreamhack] set-int  (0) 2023.11.15
[Dreamhack] csrf-2  (0) 2023.11.15
[Dreamhack] sql injection bypass WAF Advanced  (0) 2023.11.08
[Dreamhack] [wargame.kr] md5 password  (0) 2023.11.01
[Dreamhack] simple_sqli_chatgpt  (0) 2023.11.01