https://dreamhack.io/wargame/challenges/852
rot128.py는 flag.png 파일을 암호화하여 encfile로 저장하는 프로그램의 소스 코드입니다. (풀이자가 프로그램을 직접 실행할 수는 없습니다.)
주어진 encfile을 복호화하여 flag 파일 내용을 알아낸 뒤, flag.png에서 플래그를 획득하세요!
플래그의 형식은 DH{...} 입니다.
hex_list = [(hex(i)[2:].zfill(2).upper()) for i in range(256)]
hex_list는 00,01,02, ... ,FF 형태의 256개의 대문자 16진수 문자열 리스트입니다.with open('flag.png', 'rb') as f:
plain_s = f.read()
flag.png 를 바이너리로 읽어서 전체 바이트를 plain_s 에 저장합니다.plain_list = [hex(i)[2:].zfill(2).upper() for i in plain_s]
enc_list = list(range(len(plain_list)))
for i in range(len(plain_list)):
index = hex_list.index(hex_b)
index = hex_list.index(hex_b)
enc_list[i] = hex_list[(index + 128) % len(hex_list)]
enc_list = ''.join(enc_list)
with open('encfile', 'w', encoding='utf-8') as f:
encfile 을 텍스트 쓰기 모드로 엽니다. f.write(enc_list)
# encfile 읽기 (2글자씩 HEX)
with open('encfile', 'r', encoding='utf-8') as f:
enc = f.read().strip()
plain = bytearray()
# 2글자(=1바이트)씩 끊어서 처리
for i in range(0, len(enc), 2):
val = int(enc[i:i+2], 16) # 16진 문자열 → 숫자
dec = (val + 128) % 256 # ROT128 복호화
plain.append(dec)
# flag.png 복구
with open('flag_recovered.png', 'wb') as f:
f.write(plain)
print("[+] 복호화 완료 → flag_recovered.png 생성됨")
dec = (val + 128) % 256 에서 계산 결과를 되돌리고, 되돌린 바이트들을 이용해 flag.png를 복호화 합니다.
flag.png by +128 (mod 256) and saved the result in encfile.(val + 128) % 256, restoring the original PNG.DH{...}.