[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.