워게임/CTFlearn

[CTFlearn] 5x5 Crypto - 암호학 / Python

SecurityMan 2022. 11. 17. 11:00

 

CTFlearn의 서른일곱번째 문제

 

이번에는 암호학 문제이다.

 

항상 암호학 문제가 나오면 두려운데 

 

이번 문제는 그래도 쉬운편이라 다행이다.

 

반응형

 

문제 설명을 읽어보면 뭐 거의 풀이법을 다 알려주는거나 마찬가지다.

 

5x5 행렬을 하나 만들어서 순서대로 알파벳을 채워넣는데,

 

k 는 c와 발음이 같기 때문에 제외하고 25글자를 순서대로 배치한다.

 

그리고 나서 원래 행렬 읽는것처럼 한글자씩 읽어서 데이터를 가져오는데

 

이것을 5x5 Crypto 라고 한다고 한다.

 

 

우선 k를 제외하고 5x5 형태로 알파벳을 배치하면

 

이런 형태가 될것이다.

 

1-3,4-4,2-1,{,4-4,2-3,4-5,3-2,1-2,4-3,_,4-5,3-5,}

 

문제에서 주어지는 암호문은 이건데,

 

첫번째 거를 한번 풀어보면,

 

1-3 이니까

 

 

이렇게 찾아가서 1행 3열에 있는 c가 첫번째 글자가 되는 것이다.

 

그냥 하나씩 천천히 찾아가면 아주 쉽게 플래그를 찾을 수 있다.

 

여기서 끝내면 너무 쉽게 끝나는것 같아 한가지 작업을 더 해보았다.

 

abc = 'abcdefghijlmnopqrstuvwxyz'
rows = 5
cols = 5
arr = [[abc[j+(5*i)] for j in range(cols)] for i in range(rows)]

inputn = '1-3,4-4,2-1,{,4-4,2-3,4-5,3-2,1-2,4-3,_,4-5,3-5,}'.split(',')

flag = ''
for i in range(len(inputn)):
    if inputn[i] in ['{','_','}']:
        flag += inputn[i]
    else:
        first = int(inputn[i].split('-')[0])
        second = int(inputn[i].split('-')[1])

        flag += arr[first-1][second-1]

print(flag)

 

파이썬 코드로 자동으로 값을 찾아주는 것을 구현해 보았다.

 

먼저 arr 이라는 2차원 배열을 만들어서

 

배열에 a 부터 z 까지 k를 제외하고 넣어준다.

 

inputn 변수에는 주어진 암호문을 넣어서 spilt 을 이용해 , (콤마) 를 기준으로 구분지어 주고,

 

inputn 변수에 들어간 값 중 { , _ , } 가 있으면 그대로 사용하고,

 

그게 아니면 다시 split 을 이용해 - 를 기준으로 구분지어서 

 

앞, 뒤 값을 각각 행번호, 열번호로 사용한다.

 

마지막으로 for 문을 돌면서 추출한 행,열번호에 있는 값을 가져와 flag 변수에 합쳐준 뒤

 

출력해주게 된다.

 

 

코드를 실행시키면 이렇게 바로 플래그가 나오게 된다.

반응형