새소식

인기 검색어

⛳ CTF/✅ DreamHack

[DreamHack] 00. Beginner > ROT128

  • -
반응형

문제 설명
더보기

rot128.py는 flag.png 파일을 암호화하여 encfile로 저장하는 프로그램의 소스 코드입니다. (풀이자가 프로그램을 직접 실행할 수는 없습니다.)
주어진 encfile을 복호화하여 flag 파일 내용을 알아낸 뒤, flag.png에서 플래그를 획득하세요!
플래그의 형식은 DH{...} 입니다

문제 풀이
#!/usr/bin/env python3

# 0부터 255까지의 정수 16진수 문자열로 변환 , 소문자를 대문자로 변경하여 리스트 저장(ex 정수 10 = OA로 변환)
hex_list = [(hex(i)[2:].zfill(2).upper()) for i in range(256)]

# flag 파일을 이진 읽기 모드(rb)로 열고 바이트 단위로 읽어 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]

# enc_list 초기화
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)
    # 얻은 인덱스에 128을 더하고, 결과를 256으로 모듈로 연산해 새로운 인덱스 계산 후 enc_list에 저장
    enc_list[i] = hex_list[(index + 128) % len(hex_list)]

# enc_list의 모든 원소를 하나의 문자열로 결합
enc_list = ''.join(enc_list)

# 암호화 된 데이터 encfile로 저장 UTF-8인코딩으로 작성됨
with open('encfile', 'w', encoding='utf-8') as f:
    f.write(enc_list)

위의 파일은 암호화 과정을 나타낸 코드이다.

해당 코드 확인 후 복호화 코드 작성

단순히 각 바이트를 128만큼 순환 이동(shift)시키는 간단한 암호화 방식이다.

결과는 기존의 이미지 파일에서 순수 텍스트 형태로 저장된다.

복호화하면 텍스트에서 다시 이미지 파일로 확인이 가능하다는것


복호화 코드

#!/usr/bin/env python3

# 0부터 255까지의 값을 16진수 문자열로 변환하고, 대문자로 만든 후 리스트에 저장합니다.
hex_list = [(hex(i)[2:].zfill(2).upper()) for i in range(256)]

# 암호화된 파일을 읽습니다.
with open('encfile', 'r', encoding='utf-8') as f:
    enc_s = f.read()

# 두 글자씩 잘라서 리스트에 저장합니다. (암호화된 데이터는 16진수 형식 문자열입니다.)
enc_list = [enc_s[i:i+2] for i in range(0, len(enc_s), 2)]

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

# 각 암호화된 16진수 문자열에 대해 복호화 작업을 수행합니다.
for i in range(len(enc_list)):
    hex_b = enc_list[i]
    index = hex_list.index(hex_b)
    # 원본 인덱스를 얻기 위해 암호화 시에 적용한 128을 빼고 모듈로 연산을 수행합니다.
    dec_list[i] = hex_list[(index - 128) % len(hex_list)]

# 복호화된 16진수 문자열들을 바이트로 변환합니다.
dec_bytes = bytes([int(hex_val, 16) for hex_val in dec_list])

# 복호화된 데이터를 이미지 파일로 저장합니다.
with open('decrypted.png', 'wb') as f:
    f.write(dec_bytes)

위 암호화 과정을 역으로 수행하는 코드이다.

암호화된 데이터를 다시 원본 이미지 데이터로 변환하여 decrypted.png 파일로 저장한다.


왼쪽은 암호화 됐을 당시의 파일, 오른쪽은 복호화 됐을때의 파일이다.

Flag 확인이 가능하다.

반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.