# 문제링크 : https://dreamhack.io/wargame/challenges/852
ROT128
Description rot128.py는 flag.png 파일을 암호화하여 encfile로 저장하는 프로그램의 소스 코드입니다. (풀이자가 프로그램을 직접 실행할 수는 없습니다.) 주어진 encfile을 복호화하여 flag 파일 내용을 알
dreamhack.io
문제 파일
코드를 한 번 살펴보자.
코드를 해석해보자면
#!/usr/bin/env python3
# 0부터 255까지의 값을 16진수로 변환하여 두 자리씩 리스트에 저장
hex_list = [(hex(i)[2:].zfill(2).upper()) for i in range(256)]
# 'flag.png' 파일을 이진 모드로 열어서 파일의 내용을 읽어옴
with open('flag.png', 'rb') as f:
plain_s = f.read()
# 각 바이트를 16진수로 변환하여 두 자리씩 리스트에 저장
plain_list = [hex(i)[2:].zfill(2).upper() for i in plain_s]
# 암호화된 데이터를 저장할 리스트 초기화
enc_list = list(range(len(plain_list)))
# 각 바이트에 대해 128만큼 시프트된 값을 계산하여 암호화 수행
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)]
# 암호화된 데이터를 문자열로 변환
enc_list = ''.join(enc_list)
# 'encfile' 파일을 UTF-8 인코딩으로 열고, 암호화된 데이터를 파일에 씀
with open('encfile', 'w', encoding='utf-8') as f:
f.write(enc_list)
이렇게 정리할 수 있다.
코드 해석은 끝났고 이제 이 코드를 디코딩해야 한다. 디코딩은 자고로 인코딩을 거꾸로 하면 된다. 맞는 코드를 짜보자.
#!/usr/bin/env python3
# 0부터 255까지의 값을 16진수로 변환하여 리스트에 저장
hex_list = [(hex(i)[2:].zfill(2).upper()) for i in range(256)]
# 'encfile' 파일을 열어서 암호화된 데이터를 읽어옴
with open('encfile', 'r', encoding='utf-8') as f:
enc_list = f.read()
# 암호화된 데이터를 리스트로 변환
enc_list = [enc_list[i:i+2] for i in range(0, len(enc_list), 2)]
# 복호화된 데이터를 저장할 리스트 초기화
plain_list = list(range(len(enc_list)))
# 각 암호화된 바이트에 대해 128만큼 시프트된 값을 계산하여 복호화 수행
for i in range(len(enc_list)):
hex_b = enc_list[i]
index = hex_list.index(hex_b)
plain_list[i] = hex_list[(index - 128) % len(hex_list)]
# 복호화된 데이터를 바이트로 변환
plain_s = bytes.fromhex(''.join(plain_list))
# flag.png' 파일을 이진 모드로 열고, 복호화된 데이터를 파일에 씀
with open('flag.png', 'wb') as f:
f.write(plain_s)
이런 식으로 코드를 짜볼 수 있다. 순서를 거꾸로 하는 게 중요하다.
이 코드로 파일을 만들어서 실행하면 이런식으로 flag.png가 생긴다.
들어가보면 이렇게 플래그가 적혀있는 걸 볼 수 있다.
문제 해결!
+) 와... 정말 너무 어렵다. 다른 풀이들 참고 안했으면 못 풀었을 것 같다. 만만하게 봤다가 큰 코 다쳤다... 이게 새싹 단계? 암호학 문제는 함부로 건드리지 못할 것 같다...
'문제풀이' 카테고리의 다른 글
[Dreamhack] phpreg 문제풀이 (1) | 2024.01.30 |
---|---|
[Dreamhack] 64se64 문제풀이 (1) | 2024.01.30 |
[Dreamhack] dreamhack-tools-cyberchef 문제풀이 (0) | 2024.01.23 |
[Dreamhack] web-misconf-1 문제풀이 (0) | 2024.01.16 |
[Dreamhack] littlevsbig 문제풀이 (0) | 2024.01.12 |