문제 설명
다운로드 해 보면 encfile과 rot128.py 파일이 존재합니다.
이때, rot128.py로 이미 암호화된 파일이 encfile이겟죵
rot128.py를 복호화할 수 있는 코드를 짜면 되겠다!
그럼 한번 rot128.py 코드를 분석해봅시다
1. flag.png를 바이너리 파일로 열고 plain_s 라는 변수로 읽어옵니다
2. plain_list 리스트를 생성하고 각 바이트의 값을 16진수로 변환한 후 2자리로 맞추고 대문자로 변환하여 저장합니다.
3. enc_list 리스트를 생성함. 이 리스트는 plain_list와 동일한 길이를 가지며, 초기 값은 리스트의 인덱스로 설정합니다.
4. plain_list에서 각 바이트 값을 hex_list에서 찾아서 인덱스를 구함. 이때 구한 인덱스에 128를 더하고, hex_list의 길이로 나눈 나머지를 다시 hex_list에서 찾아서 enc_list에 저장!
>> 이때 128을 더하는 거는 그냥 값을 수정하는 과정인거고, hex_list의 길이로 나눈 나머지 값을 구하는 건 인덱스가 hex_list의 범우를 초과하는 경우를 방지하려고 한 것!!!!
궁금해서 챗 지피티한테 물어보니깐 아주 깔끔하게 잘 설명해줬습니당
5. 마지막.. enc_list를 문자열로 변환해서 encfile 파일에 utf-8 인코딩으로 저장합니당
암호화되어 저장된 encfile을 hexeditor를 통해 봐볼까요?
요렇게 생겼습니다.
그럼 이 친구를 다시 복호화 해서 png 파일을 구해봅시다
복호화 하는 코드는 암호화의 역과정을 통해서 짜면 되겠죠
- enfile을 텍스트 모드로 열고
- enc_list에 암호화된 값을 읽어오고
- enc_list를 2자리씩 끊어서 각 암호화된 값을 복원하고
- plain_list를 생성하고, 초기값은 리스트의 인덱스로 설정
- enc_list를 돌면서 암호화된 값을 hex_list에서 찾아서 인덱스 구하고 같은 연산 역과정을 수행: 128빼고 hex_list의 길이로 나눈 나머지를 다시 hex_list에서 찾아 plain_list에 저장하고
- plain_list를 바이트 배열로 변환하여 'decrypted_flag.png'라는 파일로 저장하면 완성!
그래서 요렇게 작성해주고요 이를 실행하면
decrypted_flag.png라는 파일이 생성됩니다!
얘를 열어 보면
이렇게 사진에 flag 값이 뜹니다 ㅎㅎㅎ
완료!
'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 |