WARGAME/cryptography

[dreamhack] ROT128

lucykorea414 2023. 5. 30. 21:17
728x90

문제 설명

다운로드 해 보면 encfile과 rot128.py 파일이 존재합니다.

이때, rot128.py로 이미 암호화된 파일이 encfile이겟죵

rot128.py를 복호화할 수 있는 코드를 짜면 되겠다!

그럼 한번 rot128.py 코드를 분석해봅시다


with open('flag.png', 'rb') as f: plain_s = f.read()

1. flag.png를 바이너리 파일로 열고 plain_s 라는 변수로 읽어옵니다

plain_list = [hex(i)[2:].zfill(2).upper() for i in plain_s]

2. plain_list 리스트를 생성하고 각 바이트의 값을 16진수로 변환한 후 2자리로 맞추고 대문자로 변환하여 저장합니다.

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

3. enc_list 리스트를 생성함. 이 리스트는 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)]

4. plain_list에서 각 바이트 값을 hex_list에서 찾아서 인덱스를 구함. 이때 구한 인덱스에 128를 더하고, hex_list의 길이로 나눈 나머지를 다시 hex_list에서 찾아서 enc_list에 저장!

>> 이때 128을 더하는 거는 그냥 값을 수정하는 과정인거고, hex_list의 길이로 나눈 나머지 값을 구하는 건 인덱스가 hex_list의 범우를 초과하는 경우를 방지하려고 한 것!!!!

궁금해서 챗 지피티한테 물어보니깐 아주 깔끔하게 잘 설명해줬습니당

enc_list = ''.join(enc_list) with open('encfile', 'w', encoding='utf-8') as f: f.write(enc_list)

5. 마지막.. enc_list를 문자열로 변환해서 encfile 파일에 utf-8 인코딩으로 저장합니당

암호화되어 저장된 encfile을 hexeditor를 통해 봐볼까요?

요렇게 생겼습니다.

그럼 이 친구를 다시 복호화 해서 png 파일을 구해봅시다


복호화 하는 코드는 암호화의 역과정을 통해서 짜면 되겠죠

  1. enfile을 텍스트 모드로 열고
  2. enc_list에 암호화된 값을 읽어오고
  3. enc_list를 2자리씩 끊어서 각 암호화된 값을 복원하고
  4. plain_list를 생성하고, 초기값은 리스트의 인덱스로 설정
  5. enc_list를 돌면서 암호화된 값을 hex_list에서 찾아서 인덱스 구하고 같은 연산 역과정을 수행: 128빼고 hex_list의 길이로 나눈 나머지를 다시 hex_list에서 찾아 plain_list에 저장하고
  6. plain_list를 바이트 배열로 변환하여 'decrypted_flag.png'라는 파일로 저장하면 완성!

그래서 요렇게 작성해주고요 이를 실행하면

decrypted_flag.png라는 파일이 생성됩니다!

얘를 열어 보면

이렇게 사진에 flag 값이 뜹니다 ㅎㅎㅎ

완료!

728x90

'WARGAME > cryptography' 카테고리의 다른 글

[dreamhack] Basic_Crypto1  (0) 2023.11.08
[h4cking game] Hello, Postman  (0) 2023.06.17
[써니나타스] 26번  (0) 2023.05.30
[써니나타스] 18번  (0) 2023.05.30
[h4cking game] ROX  (0) 2023.05.30