1. 문제 test
카이사르 암호화 방식으로 되어있는 소스코드를 보고 복호화 하는 문제인것 같다.
2. 카이사르 암호란?
알파벳을 13자리 씩 밀어내며 암호화 하는 방식이다.
즉, 알파벳을 일정한 수만큼 밀어내고 원래의 문자와 다른 문자를 치환하는 방식이다.
밑의 예시를 보면 13자리 씩 알파벳을 밀어내서 A == N , B == O... 형식으로 치환된다.
따라서 HELLO 를 치환하면 URYYB이다.
3. 코드 분석
전체 코드는 아래와 같다. 한개 씩 분석을 진행해보자
먼저 이 코드는 hex 리스트를 만드는 것이다. 범위는 0~255 까지이다.
범위가 255까지인 이유는 hex 값을 2자리로 모든 경우의 수를 따지면 16*16 = 256이라서 이다.
hex(i) → i 를 hex 값으로 바꿔준다.
[2:] → 16진수를 나타내는 0x를 없애주기 위해서 [2:] 를 사용한다.
.zfill(2).upper() → 2자리로 만들기 위해서 0으로 채워준다. 이후 대문자로 바꾼다.
hex(i)[2:].zfill(2).upper()
flag.png를 rb모드로 열고 평문 텍스트를 저장한다.
plain_list 에 hex 값을 저장했던 것처럼 0x 부호를 없애고 2자리를 완성하기 위해서 0을 채우고 대문자로 바꾼다.
enc_list 는 plain_list의 길이만큼 지정한다.
카이사르 암호화 방식으로 하기 때문에 모든 평문은 단순 치환됨으로 평문과 암호문의 길이는 같다.
암호화를 위해서 평문 길이만큼 for문을 돌린다.
hex_b 에는 plain list[i]를 대입하고
index 에는 현재 hex값이 hex_list에서 어느 index에 위치하는지 찾고 대입한다.
enc_list[i]에는 index + 128을 하고 hex_list 길이 만큼 나눈 나머지를 대입하므로 128만큼 이동시키는 역할을 한다.
즉, 해당 문제는 제목에서도 알 수 있듯이 hex 값을 128만큼 밀어내고 치환하는 방식을 사용한다.
4. exploit
똑같이 hex_list를 생성한다.
encfile을 열고 cipher_s에 암호문 hex값들을 넣는다.
cipher_list를 0 부터 2의 크기만큼 계속 대입하여 list를 만들어주며 반복마다 2개의 문자를 가져온다.
이후 다시 평문을 완성하기 위해서 암호문 list만큼의 크기로 plain_list를 생성한다.
for 문을 암호화 list 길이만큼 돌린다.
hex_b 에 cipher_list[i]를 넣어주고
index 에는 hex_b의 index를 찾아서 대입한다.
plain_list[i]에는 hex값을 -128만큼 다시 이동시켜서 평문을 구해준다.
이후 평문을 바이트 단위로 변환하고 .png로 평문을 생성한다.
바이트 단위로 바꾸는 이유는 이미지 파일같은 이진 파일은 처리할 때 바이트 단위로 하기 때문이다.
5.결과
png로 완성하니 flag를 가진 사진으로 변환된다.
참고 문헌
'Wargame > wargame 암호학' 카테고리의 다른 글
[Dreamhack] likeb64 (0) | 2024.05.11 |
---|---|
[Dreamhack] DARIMCHAL_001 (0) | 2024.04.30 |
[Dreamhack] robot_only (0) | 2024.04.30 |
[Dreamhack] basic crypto (0) | 2024.04.29 |
[Dreamhack] SingleByteXor (0) | 2024.04.29 |