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 |