Post

[Dreamhack]rot128 풀이

개요

DreamHack의 워게임 rot128문제에 대한 풀이를 작성했습니다.

해당 공격 기법들을 허가되지 않은 실제 운영 서버에서 시도하는 것은 정보통신망법에 어긋나는 행위입니다.

풀이

1. 코드분석

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/usr/bin/env python3

hex_list = [(hex(i)[2:].zfill(2).upper()) for i in range(256)]  # 00~FF 까지의 hex값을 리스트형태로 순서대로 저장

with open('flag.png', 'rb') as f:   # flag.png를 바이너리형식의 읽기모드로 열기
    plain_s = f.read()  # flag.png의 문자열을 plain_s에 저장

plain_list = [hex(i)[2:].zfill(2).upper() for i in plain_s]     # 1바이트씩 불러들여 2자리의 hex값으로 변환후 리스트로 저장

enc_list = list(range(len(plain_list)))

for i in range(len(plain_list)):    # plain_list의 길이만큼 반복(0~길이)
    hex_b = plain_list[i]   # plain_list의 첫번째 값부터 순서대로 넣기
    index = hex_list.index(hex_b)   # hex_list에 hex_b와 같은 값의 인덱스를 index에 저장
    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을 읽기모드로 utf-8인코딩형식으로 열기
    f.write(enc_list)      # encfile에 enc_list의 문자열 쓰기

2. 복호화 코드 작성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
hex_list = [(hex(i)[2:].zfill(2).upper()) for i in range(256)]  # 00~FF 까지의 hex값을 리스트형태로 순서대로 저장


with open('ROT128\encfile', 'rb') as f:     # 암호화된 파일 불러오기
    encfile = f.read()

encfile_list = [encfile[i:i+2].decode('utf-8') for i in range(0, len(encfile), 2)]    # 불러온 암호화된 파일을 2자리씩 UTF-8인코딩으로 lsit자료형으로 저장


result_list = list(range(len(encfile_list)))    # 마지막 flag.png 바이너리의 문자열이 될 변수 생성

for i in range(len(encfile_list)):      # encfile_list의 길이만큼 반복 (0~encfile_list길이)
    hex_b = encfile_list[i]     # encfile_list의 첫번째 인덱스부터 순서대로 값으 넣음
    index = hex_list.index(hex_b)   # hex_list에서 방금 넣었던 hex_b의 값과 동일한 값의 hex_list 인덱스값을 index에 저장
    result_list[i] = hex_list[index - 128]  # index값에서 128을 뺀 hex_list인덱스의 값을 저장

result_list = ''.join(result_list)  # 모든 리스트의 요소들을 이어 하나의 문자열로 변경

with open('flag.png', 'wb') as f:   # flag.png파일을 쓰기와 바이너리 파일로 오픈
    f.write(bytes.fromhex(result_list))     # result_list를 바이너리형태로 flag.png에 쓰기
This post is licensed under CC BY 4.0 by the author.