워게임/dreamhack

[dreamhack] ROT128 문제풀이

  • -

ROT128

목차

  • 문제 설명
  • 해결 과정
  • Exploit 코드
  • 문제 요약
  •  

문제 설명

-ROT128의 문제 설명

ROT128의 문제 설명

 

암호화된 encfile을 복호화 하여 flag.png를 취득하는 문제입니다.


해결과정

#!/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을 빼면서 역연산후 진행해주면된다.


문제 요약

- 단순히 코드만 읽을줄 알면 되는 문제였다.

Contents

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

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