[Dreamhack CTF] ROT128

Sungwuk·2024년 12월 2일
0

dreamhack

목록 보기
13/17

문제를 보자

rot128.py를 보면

#!/usr/bin/env python3

hex_list = [(hex(i)[2:].zfill(2).upper()) for i in range(256)]

with open('flag.png', 'rb') as f:
    plain_s = f.read()

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)):
    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)

with open('encfile', 'w', encoding='utf-8') as f:
    f.write(enc_list)

이 코드는 PNG 이미지 파일을 Caesar cipher 방식으로 인코딩

일반적인 시저 암호가 알파벳을 시프트하는 것처럼, 이 코드는 바이트값을 128만큼 시프트합니다. 각 바이트에 대해 (현재값 + 128) % 256 연산을 수행하는 단순한 대체 암호화


주요 동작

  • 0-255 범위의 모든 16진수 값 목록 생성
  • PNG 파일을 바이트로 읽어서 16진수로 변환
  • 각 바이트를 128만큼 시프트하여 암호화 (모듈로 256 연산 적용)
  • 암호화된 결과를 문자열로 저장

복호화하려면 반대로 -128 시프트를 적용하면 됩니다. 간단한 대체 암호(substitution cipher)의 한 형태

그래서 어떻게 해야할까?

그대로 복호화하면 된다

#!/usr/bin/env python3

hex_list = [(hex(i)[2:].zfill(2).upper()) for i in range(256)]

with open('encfile', 'r') as f:
    enc_str = f.read()

dec_bytes = bytearray()
for i in range(0, len(enc_str), 2):
    hex_b = enc_str[i:i+2]
    index = hex_list.index(hex_b)
    dec_hex = hex_list[(index - 128) % len(hex_list)]
    dec_bytes.append(int(dec_hex, 16))

with open('decoded.png', 'wb') as f:
    f.write(dec_bytes)

이걸 실행하면 png가 생성된다

profile
보안전문가 꿈나무

0개의 댓글