#!/usr/bin/env python3
hex_list = [(hex(i)[2:].zfill(2).upper()) for i in range(256)] # 0부터 256까지 16진수로된 리스트 생성
with open('flag.png', 'rb') as f: # flag.png 파일을 읽어옴
plain_s = f.read()
plain_list = [hex(i)[2:].zfill(2).upper() for i in plain_s] #읽은 데이터를 16진수로된 리스트 생성
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)] #읽은데이터의 16진수 값의 인덱스 번호를 128를 더하고 256의 나머지 값의 순서의 hexlist 값을 enc_list에 암호화 한다
enc_list = ''.join(enc_list)
with open('encfile', 'w', encoding='utf-8') as f:
f.write(enc_list)
- 암호화 코드를 분석해 보면 파일의 데이터를 16진수로 변환 후 리스트에 저장한 다음 해당 바이트 위치를 찾습니다. 그 후 인데스 번호에 128을 더하고 만일 256이 넘으면 나머지 연산을 진행하여 인덱스에서 벗어나지 않게 진행해 준다. 몹시 어려운 거 없이 역연산만 진행하면 될 거 같다
Exploit 코드
with open('encfile', 'r', encoding='utf-8') as f:
encrypted_text = f.read()
hex_list = [(hex(i)[2:].zfill(2).upper()) for i in range(256)]
enc_pairs = [encrypted_text[i:i+2] for i in range(0, len(encrypted_text), 2)]
dec_list = list(range(len(enc_pairs)))
for i in range(len(enc_pairs)):
hex_b = enc_pairs[i]
index = hex_list.index(hex_b)
dec_list[i] = hex_list[(index - 128)]
dec_ = bytes([int(b, 16) for b in dec_list])
with open('decrypted_flag.png', 'wb') as f:
f.write(dec_)
암호화된 파일은 16진수로 진행되어 있기때문에, 2바이트씩 잘라서 나눠주고 128을 빼면서 역연산후 진행해주면된다.