-
[Clear] X-MAS CTF 2020 Scrambled Carol WriteupCTF/X-MAS CTF 2020 2020. 12. 20. 17:30
이 문제는 Cryptography 문제였으며, 상세 내용은 아래와 같다.
분류는 암호학으로 되어있었지만 문제 안에 reverse engineering 이란 단어를 보고 도전한 문제..
주어진 script.py 파일을 보자.
import os import random def get_seed(size): return int(os.urandom(size).hex(), 16) input_data = None output_data = "" seed = get_seed(4) random.seed(seed) old_sigma = "0123456789abcdef" ###### new_sigma = list(old_sigma) ###### 비트, 문자 또는 블록을 문자 집합 내부에서 random.shuffle(new_sigma) ###### 자리를 바꾸는 규칙을 의미하는 new_sigma = ''.join(new_sigma) ###### 전치암호화의 과정. (일대일 대응) print(old_sigma, new_sigma) ###### with open("input.txt", "r") as in_file: input_data = in_file.read() for alpha in input_data: encoded = (bytes(alpha.encode()).hex()) output_data += new_sigma[old_sigma.index(encoded[0])] output_data += new_sigma[old_sigma.index(encoded[1])] with open("output.txt", "w") as out_file: out_file.write(str(output_data))
소스 내용은 위와 같으며, 소스를 분석해보거나 실제로 몇번 테스트를 해보면 로직을 분석 할 수 있다.
1) input.txt파일을 읽어서 문자를 16진수 형태의 아스키 코드 값으로 변환 후(ex a -> 61)
2) 아스키코드에 쓰이는 문자인 old_sigma 값 즉, 0123456789abcdef 를 랜덤하게 전치암호화 하여
3) 변환된 값을 out.put.txt로 출력한다.
테스트 예시를 들면 input.txt의 내용을 abcde 로 설정 후 script.py 파일을 실행시키면
373a3c3f31 로 변환됨을 알 수 있는데 이는 abcde의 16진수 형태 아스키코드값인 6162636465 로 변환 후
랜덤하게 전치암호화를 하여 6->3 / 1->7 / 2->c / 4->f / 5->1 로 변환 후 출력해줌을 알 수 있다.
그렇다면 역분석을 해야 할 주어진 암호문을 보자.
3b180e0b05d71802070d0ed31918c30e0c18d4d309d1d41809d10c1801d1070d0ed305d718d40e070207020d158f37d31807d418d30e0c1802070d0ed3180b00180bdcd118030c09d118c409d0070bdcd11dd4180107d1d30e128f350b020d180509d718d30e0c18dd0bd1050318070218d4070218090203180cd1d10bd118d8070207020d158fc3070505183e0c1809d8d80c09d11d031809020318d30e0c18d40bdc0518000c05d31807d3d418dd0bd1d30e128f3918d30ed1070505180b00180e0bd80c1518d30e0c18dd0c09d1d718dd0bd1050318d10c0f0b07040cd4158f300bd118d70b02030cd11801d10c0906d4180918020cdd18090203180d050bd1070bdcd4180a0bd102128f8f30090505180b0218d70bdcd11806020c0cd419183b180e0c09d118d30e0c1809020d0c0518d00b07040cd4198f3b1802070d0ed3180307d007020c15183b1802070d0ed318dd0e0c0218340ed107d4d318dd09d418010bd102468f3b1802070d0ed3180307d007020c15183b1802070d0ed315183b1802070d0ed3183307d007020c128f8f350c031801d718d30e0c1805070d0ed3180b0018300907d30e18d40cd10c020c05d718010c090a07020d158fcd07d30e180d050bdd07020d180e0c09d1d3d41801d7183e07d41804d10903050c18dd0c18d4d3090203128fc40b18050c031801d71805070d0ed3180b00180918d4d309d118d4dd0c0cd305d7180d050c090a07020d158f3e0cd10c18040b0a0c18d30e0c18dd07d40c180a0c021800d10b0a18d30e0c183bd1070c02d31805090203128fc30e0c183607020d180b00183607020dd4180509d718d30edcd418070218050bdd05d7180a09020d0cd1468f370218090505180bdcd118d3d1070905d418010bd10218d30b18010c180bdcd11800d1070c0203128f8f3e0c1806020bddd4180bdcd118020c0c031518d30b180bdcd118dd0c0906020cd4d40cd418020b18d4d3d109020d0cd1158f310c0e0b050318d70bdcd1183607020d1918310c000bd10c183e070a18050bdd05d718010c0203198f310c0e0b050318d70bdcd1183607020d1518310c000bd10c183e070a18050bdd05d718010c0203198f8fc3d1dc05d7183e0c18d309dc0d0ed318dcd418d30b18050bd00c180b020c1809020bd30e0cd1468f3e07d4180509dd1807d418050bd00c18090203183e07d4180d0bd4d80c051807d418d80c09040c128f340e090702d418d40e090505183e0c1801d10c090618000bd118d30e0c18d40509d00c1807d4180bdcd11801d10bd30e0cd1468f390203180702183e07d41802090a0c18090505180bd8d8d10cd4d4070b0218d40e09050518040c09d40c128fc4dd0c0cd3180ed70a02d4180b00180f0bd7180702180dd109d30c00dc0518040e0bd1dcd418d10907d40c18dd0c158f350cd31809050518dd07d30e070218dcd418d8d10907d40c183e07d4180e0b05d71802090a0c128f8f340ed107d4d31807d418d30e0c18350bd10319183b18d8d10907d40c183e07d41832090a0c18000bd10cd00cd1158f3e07d418d80bdd0cd118090203180d050bd1d7180cd00cd10a0bd10c18d8d10b040509070a128f3e07d418d80bdd0cd118090203180d050bd1d7180cd00cd10a0bd10c18d8d10b040509070a12188f8fc30e07d4180409d10b0518dd09d4180c02040b030c0318d30b180d09d101090d0c1801d7183ec3d4c8180d09020d128fc30e0c180005090d1807d418de0a09d4dd09d4020cd00cd109d40d0b0b0309d407d307d4d30e07d4d70c09d18f
... 주어진 암호문의 길이는 2568로 한 글자에 2씩 사용하니 1284글자에 육박했다.. 제목이 Scrambled Carol 임을 감안하여 특정 캐롤의 가사일 것이라고 생각했고, 그 캐롤의 제목이 FLAG 일 것이라고 추측을 하며 분석을 시작하였다.
정보보안기사를 공부하면서 알게 된 암호 공격 기법 중 암호문 단독 공격 기법이 유효할 것이라고 생각했다.
( * 암호문 단독공격(Ciphertext Only Attack; COA)이란 도청자가 알고리즘을 알고 있고, 암호문을 가로챌 수 있다는 가정하에 도청자가 어떤 암호문을 얻어서 대응되는 평문과 키를 찾는 공격을 말한다. 도청자는 암호문을 가지고 통계적 성질, 문장의 특성 등을 추정하여 해독하기 때문에, 가장 쉽게 적용될 수 있는 공격이다.
예를 들자면, 영어로 된 평문을 암호화시킨 암호문을 암호문 단독 공격으로 얻어냈을 때 영어에서 가장 많이 쓰이는 글자가 e이기 때문에 가장 많이 나오는 글자는 e일 것이라고 예측을 하는 것이다.)
문제 풀이 과정이 암호문 단독 공격의 예시가 정확히 맞는지는 모르겠지만..
우선 내가 분석을 위해 첫 번째로 진행한 과정은 주어진 암호문을 두 글자씩 나눈 후(문자를 16진수 아스키코드 값을 변환하면 두자릿수 16진수가 한 글자를 나타내기 때문이다.), 첫 번째 문자로 어떤 값들이 사용되었는지 파악하였다.
그 이유는 아스키 코드 표를 보면 16진수 기준 0x00 ~ 0x7F 로 첫 번째로 나올 수 있는 값들이 0, 1, 2, 3, 4, 5, 6, 7 로 제한되어 있으며 그중 문자열로 표현 가능한 값들은 2~7로 압축되기 때문이다.
for i in range(1284) : arr.append(encrypted[(i*2)]+encrypted[((i*2)+1)]) print(arr) for i in range(len(arr)) : if arr[i][0] not in firsthex : firsthex.append(arr[i][0]) print(firsthex)
위와 같은 테스트 코드를 활용하여 얻은 값은
였다. 위에서 첫 번째 문자로 사용될 수 있는 값들은 2,3,4,5,6,7 6자리라고 했는데 7 자리가 나왔다.. 0x00 ~ 0x1F 중 활용될 수 있는 값이 뭐가 있을까를 생각해보기로 하고 다음 단계로 진입하였다. 다음 단계로는 이전 단계에서 얻은 첫번째 값들을 기준으로 어떤 값들이 얼마나 쓰였는지를 분석하였다.
이는, 앞서 언급한 암호문 단독 공격의 예시로 영어에서 많이 쓰이는 글자가 e임을 이용하여 e에 매칭되는 값을 우선적으로 분석하면서 해독해나가는 것 처럼 자주 쓰일만한 문자를 파악하여 분석해나가기 위함이었다.
for i in range(len(arr)) : if arr[i][0] == '3' : arr3.append(arr[i]) if arr[i][0] == '1' : arr1.append(arr[i]) if arr[i][0] == '0' : arr0.append(arr[i]) if arr[i][0] == 'd' : arrd.append(arr[i]) if arr[i][0] == 'c' : arrc.append(arr[i]) if arr[i][0] == '8' : arr8.append(arr[i]) if arr[i][0] == '4' : arr4.append(arr[i]) print('================================') print(arr3) print(arr1) print(arr0) print(arrd) print(arrc) print(arr8) print(arr4) print('================================') arr3=set(arr3) arr3=list(arr3) print(arr3) arr1=set(arr1) arr1=list(arr1) print(arr1) arr0=set(arr0) arr0=list(arr0) print(arr0) arrd=set(arrd) arrd=list(arrd) print(arrd) arrc=set(arrc) arrc=list(arrc) print(arrc) arr8=set(arr8) arr8=list(arr8) print(arr8) arr4=set(arr4) arr4=list(arr4) print(arr4)
문제를 급히 푸느라 노가다성이 다분하긴 하지만.. 위 테스트 코드를 통해 분석 한 결과,
['3b', '37', '35', '3e', '39', '30', '30', '3b', '3b', '3b', '34', '3b', '3b', '3b', '33', '35', '30', '3e', '3e', '3b', '36', '36', '37', '3e', '31', '36', '31', '3e', '31', '36', '31', '3e', '3e', '3e', '3e', '34', '3e', '39', '3e', '35', '3e', '34', '35', '3b', '3e', '32', '3e', '3e', '3e'] ['18', '18', '19', '18', '18', '18', '18', '18', '15', '18', '18', '18', '18', '18', '18', '18', '1d', '18', '12', '18', '18', '18', '18', '18', '18', '18', '18', '15', '18', '18', '1d', '18', '18', '18', '18', '18', '18', '12', '18', '18', '18', '15', '18', '18', '18', '18', '15', '18', '18', '18', '18', '18', '18', '18', '12', '18', '18', '18', '19', '18', '18', '18', '18', '18', '19', '18', '18', '15', '18', '18', '18', '18', '18', '18', '18', '18', '15', '18', '18', '15', '18', '18', '18', '12', '18', '18', '18', '18', '18', '18', '18', '15', '18', '18', '18', '18', '18', '18', '18', '12', '18', '18', '18', '18', '18', '18', '18', '18', '15', '18', '18', '18', '18', '18', '18', '18', '18', '12', '18', '18', '18', '18', '18', '18', '18', '18', '18', '18', '18', '18', '18', '18', '18', '18', '12', '18', '18', '18', '15', '18', '18', '18', '18', '18', '15', '18', '18', '19', '18', '18', '18', '18', '19', '18', '18', '15', '18', '18', '18', '18', '19', '18', '18', '18', '18', '18', '18', '18', '18', '18', '18', '18', '18', '18', '18', '18', '12', '18', '18', '18', '18', '18', '18', '18', '18', '18', '18', '18', '18', '18', '18', '18', '18', '12', '18', '18', '18', '18', '18', '18', '18', '18', '15', '18', '18', '18', '18', '18', '18', '18', '12', '18', '18', '18', '19', '18', '18', '18', '18', '18', '15', '18', '18', '18', '18', '18', '12', '18', '18', '18', '18', '18', '12', '18', '18', '18', '18', '18', '18', '18', '18', '18', '12', '18', '18', '18'] ['0e', '0b', '05', '02', '07', '0d', '0e', '0e', '0c', '09', '09', '0c', '01', '07', '0d', '0e', '05', '0e', '07', '02', '07', '02', '0d', '07', '0e', '0c', '02', '07', '0d', '0e', '0b', '00', '0b', '03', '0c', '09', '09', '07', '0b', '01', '07', '0e', '0b', '02', '0d', '05', '09', '0e', '0c', '0b', '05', '03', '07', '02', '07', '02', '09', '02', '03', '0c', '0b', '07', '02', '07', '02', '0d', '07', '05', '05', '0c', '09', '0c', '09', '03', '09', '02', '03', '0e', '0c', '0b', '05', '00', '0c', '05', '07', '0b', '0e', '0e', '07', '05', '05', '0b', '00', '0e', '0b', '0c', '0e', '0c', '0c', '09', '0b', '05', '03', '0c', '0f', '0b', '07', '04', '0c', '0b', '0b', '02', '03', '0c', '01', '0c', '09', '06', '09', '02', '0c', '09', '02', '03', '0d', '05', '0b', '07', '0b', '0a', '0b', '02', '09', '05', '05', '0b', '02', '0b', '06', '02', '0c', '0c', '0e', '0c', '09', '0e', '0c', '09', '02', '0d', '0c', '05', '0b', '07', '04', '0c', '02', '07', '0d', '0e', '03', '07', '07', '02', '0c', '02', '07', '0d', '0e', '0e', '0c', '02', '0e', '07', '09', '01', '0b', '02', '02', '07', '0d', '0e', '03', '07', '07', '02', '0c', '02', '07', '0d', '0e', '02', '07', '0d', '0e', '07', '07', '02', '0c', '0c', '03', '01', '0e', '0c', '05', '07', '0d', '0e', '0b', '00', '09', '07', '0e', '0c', '0c', '02', '0c', '05', '01', '0c', '09', '0a', '07', '02', '0d', '07', '0e', '0d', '05', '0b', '07', '02', '0d', '0e', '0c', '09', '01', '07', '04', '09', '03', '05', '0c', '0c', '09', '02', '03', '0b', '05', '0c', '03', '01', '05', '07', '0d', '0e', '0b', '00', '09', '09', '0c', '0c', '05', '0d', '05', '0c', '09', '0a', '07', '02', '0d', '0c', '0c', '04', '0b', '0a', '0c', '0e', '0c', '07', '0c', '0a', '0c', '02', '00', '0b', '0a', '0e', '0c', '07', '0c', '02', '05', '09', '02', '03', '0e', '0c', '07', '02', '0d', '0b', '00', '07', '02', '0d', '05', '09', '0e', '07', '02', '05', '0b', '05', '0a', '09', '02', '0d', '0c', '02', '09', '05', '05', '0b', '07', '09', '05', '01', '0b', '02', '0b', '01', '0c', '0b', '00', '07', '0c', '02', '03', '0c', '06', '02', '0b', '0b', '02', '0c', '0c', '03', '0b', '0b', '0c', '09', '06', '02', '0c', '0c', '02', '0b', '09', '02', '0d', '0c', '0c', '0e', '0b', '05', '03', '0b', '07', '02', '0d', '0c', '00', '0b', '0c', '07', '0a', '05', '0b', '05', '01', '0c', '02', '03', '0c', '0e', '0b', '05', '03', '0b', '07', '02', '0d', '0c', '00', '0b', '0c', '07', '0a', '05', '0b', '05', '01', '0c', '02', '03', '05', '0c', '09', '0d', '0e', '0b', '05', '0b', '0c', '0b', '02', '0c', '09', '02', '0b', '0e', '0c', '07', '05', '09', '07', '05', '0b', '0c', '09', '02', '03', '07', '0d', '0b', '0c', '05', '07', '0c', '09', '04', '0c', '0e', '09', '07', '02', '0e', '09', '05', '05', '0c', '01', '0c', '09', '06', '00', '0b', '0e', '0c', '05', '09', '0c', '07', '0b', '01', '0b', '0e', '0c', '02', '03', '07', '02', '07', '02', '09', '0a', '0c', '09', '05', '05', '0b', '0c', '07', '0b', '02', '0e', '09', '05', '05', '04', '0c', '09', '0c', '0c', '0c', '0e', '0a', '02', '0b', '00', '0f', '0b', '07', '02', '0d', '09', '0c', '00', '05', '04', '0e', '0b', '09', '07', '0c', '0c', '0c', '09', '05', '05', '07', '0e', '07', '02', '09', '07', '0c', '07', '0e', '0b', '05', '02', '09', '0a', '0c', '0e', '07', '07', '0e', '0c', '0b', '03', '09', '07', '0c', '07', '09', '0a', '0c', '00', '0b', '0c', '0c', '07', '0b', '0c', '09', '02', '03', '0d', '05', '0b', '0c', '0c', '0a', '0b', '0c', '0b', '04', '05', '09', '07', '0a', '07', '0b', '0c', '09', '02', '03', '0d', '05', '0b', '0c', '0c', '0a', '0b', '0c', '0b', '04', '05', '09', '07', '0a', '0e', '07', '04', '09', '0b', '05', '09', '0c', '02', '04', '0b', '03', '0c', '03', '0b', '0d', '09', '01', '09', '0d', '0c', '01', '0d', '09', '02', '0d', '0e', '0c', '00', '05', '09', '0d', '07', '0a', '09', '09', '02', '0c', '0c', '09', '0d', '0b', '0b', '03', '09', '07', '07', '0e', '07', '0c', '09'] ['d7', 'd3', 'd4', 'd3', 'd1', 'd4', 'd1', 'd1', 'd3', 'd7', 'd4', 'd3', 'd4', 'd3', 'd3', 'dc', 'd1', 'd1', 'd0', 'dc', 'd1', 'd4', 'd1', 'd3', 'd7', 'd3', 'dd', 'd1', 'd4', 'd1', 'd1', 'd1', 'd8', 'd8', 'd8', 'd1', 'd3', 'd4', 'dc', 'd3', 'd3', 'd4', 'dd', 'd1', 'd3', 'd3', 'd1', 'd8', 'd3', 'dd', 'd1', 'd7', 'dd', 'd1', 'd1', 'd4', 'd1', 'd7', 'd1', 'd1', 'd4', 'dd', 'd1', 'dc', 'd4', 'd1', 'd7', 'dc', 'd1', 'd4', 'd1', 'd3', 'd0', 'd4', 'd3', 'd0', 'd3', 'dd', 'd1', 'd4', 'd3', 'dd', 'd4', 'd1', 'd3', 'd0', 'd3', 'd3', 'd0', 'd7', 'd3', 'd3', 'd3', 'd4', 'd1', 'd7', 'd3', 'dd', 'd1', 'd3', 'd4', 'd7', 'd4', 'd1', 'dd', 'd4', 'd3', 'd7', 'd3', 'd4', 'd3', 'd1', 'd4', 'dd', 'd3', 'd7', 'd1', 'd3', 'dd', 'd4', 'd1', 'd3', 'd1', 'd3', 'd4', 'd7', 'd3', 'dc', 'd4', 'dd', 'd7', 'd1', 'dc', 'd1', 'd3', 'd1', 'd4', 'd1', 'd3', 'dc', 'd1', 'd1', 'dd', 'd4', 'dc', 'd1', 'd3', 'dc', 'd1', 'dd', 'd4', 'd4', 'd4', 'd4', 'd3', 'd1', 'd1', 'd7', 'dc', 'd1', 'd1', 'dd', 'd7', 'd7', 'dc', 'd1', 'd1', 'dd', 'd7', 'd1', 'dc', 'd7', 'd3', 'dc', 'd3', 'dc', 'd4', 'd3', 'd0', 'd3', 'd1', 'd4', 'dd', 'd4', 'd0', 'd4', 'd4', 'd8', 'd4', 'd8', 'd4', 'd4', 'd1', 'd1', 'd3', 'd4', 'd0', 'd4', 'dc', 'd1', 'd1', 'd3', 'd1', 'd4', 'd8', 'd8', 'd1', 'd4', 'd4', 'd4', 'd4', 'dd', 'd3', 'd7', 'd4', 'd7', 'd1', 'd3', 'dc', 'd1', 'dc', 'd4', 'd1', 'd4', 'dd', 'd3', 'dd', 'd3', 'dc', 'd4', 'd8', 'd1', 'd4', 'd4', 'd7', 'd1', 'd4', 'd3', 'd4', 'd3', 'd1', 'd8', 'd1', 'd4', 'd4', 'd1', 'd0', 'd1', 'd4', 'd8', 'dd', 'd1', 'd1', 'd7', 'd0', 'd1', 'd1', 'd8', 'd1', 'd4', 'd8', 'dd', 'd1', 'd1', 'd7', 'd0', 'd1', 'd1', 'd8', 'd1', 'd4', 'd1', 'dd', 'd4', 'd3', 'd1', 'd7', 'd4', 'd4', 'de', 'd4', 'dd', 'd4', 'd0', 'd1', 'd4', 'd4', 'd3', 'd4', 'd3', 'd4', 'd7', 'd1'] ['c3', 'c4', 'c3', 'cd', 'c4', 'c3', 'c3', 'c4', 'c3', 'c3', 'c8', 'c3'] ['8f', '8f', '8f', '8f', '8f', '8f', '8f', '8f', '8f', '8f', '8f', '8f', '8f', '8f', '8f', '8f', '8f', '8f', '8f', '8f', '8f', '8f', '8f', '8f', '8f', '8f', '8f', '8f', '8f', '8f', '8f', '8f', '8f', '8f', '8f'] ['46', '46', '46', '46'] ================================ ['33', '36', '32', '39', '34', '3b', '3e', '37', '31', '30', '35'] ['15', '12', '18', '19', '1d'] ['0a', '02', '0c', '05', '00', '0e', '04', '07', '0f', '01', '03', '06', '0d', '0b', '09'] ['d8', 'dc', 'd3', 'd1', 'd0', 'd4', 'd7', 'dd', 'de'] ['c3', 'cd', 'c4', 'c8'] ['8f'] ['46']
위와 같은 결과를 도출해내었다. "================" 를 기준으로 위의 리스트는 전체 문자를 앞자리별로 구분한 값이었으며 아래의 리스트는 중복제거를 한 값이다.
첫 번째로는 6->0 로 치환된 것일 거라고 추측하였다.
그 이유는, 0으로 시작하는 문자는 가능한 모든 경우의 수인 15가지가 모두 사용되었는데 가장 많이 사용되었을 것이라고 추측되는 영어 소문자의 아스키코드값은 6x이기 때문이다.
아! 암호 해독에 사용될 코드를 먼저 소개하겠다.
for i in range(len(arr)) : table = str.maketrans('0', '6') ##### ..... (1) arr[i]=arr[i].translate(table) #print(arr) for i in range(len(arr)) : plaintext += chr(int('0x'+arr[i],16)) print(plaintext)
위와 같은 형식의 코드로 암호 해독을 할 것인데 (1) 줄이 나타내는 의미는 0을 6으로 치환하겠다는 의미이다.
즉, 최종 플래그를 획득 할 코드는 maketrans함수의 인자값이 16자리 문자열 두 개가 될 것이다.
다시 문제로 돌아와서 6->0 으로 치환되었다고 추측을 하였으니 다시 0->6으로 치환을 해준 결과
아래와 같았다. 아직 갈 길이 멀어보인다.
두 번째로는 7과 4가 각각 d나 3중 하나로 치환되었을 것이라는 추측이었다. 3으로 시작하는 리스트와 d로 시작하는 리스트가 0으로 시작하는 리스트에 이어 많은 종류로, 많이 쓰였는데 7과 4는 각각 영어 소문자의 나머지 부분과 영어 대문자를 의미하기 때문이다. 나는 d가 두번째로 많은 횟수로 사용되었으므로 d->7, 5->4으로 역변환하여 테스트를 해보았다.
table = str.maketrans('0d3', '674')
이전 코드에 비해 영어가 많아지긴 했지만, 아직 복잡하다..
세 번째 추측은 2,0 이 1,8 로 치환되었을 것이라는 추측이었다. 그 이유는 암호문 중 1로 시작하는 리스트를 분석해보면 쓰여진 종류는 다섯가지지만 사용된 빈도는 18이 압도적으로 많음을 볼 수 있다.
그래서 나는 영어 대,소문자를 제외하고 가장 많이 사용되었을 것이라고 추측 할 수 있는 띄어쓰기 를 나타내는 아스키코드 값인 20이 18로 치환되었다고 생각하였다. 이를 적용해보면
table = str.maketrans('0d318', '67420')
이전에 비해 제법 문자열 티가 나지만 갈길이 멀어보인다..
다음 추측으로는 a->f 로 변환되었을 것이라고 생각했다. 그 이유는 앞선 내 추측에 의하면 0은 8로 치환되었는데
암호문을 리스트화하여 분석한 내용을 보면 8로 시작하는 문자가 한 종류로 여러번 사용되었음을 알 수 있다.
즉 아스키코드표에서 0으로 시작하는 문자가 쓰였다는 것인데, 0x00~0x0f 의 아스키 문자 중 그나마 활용 가능한 문자가 개행문자일 것이라고 생각했고 그렇다면 0a가 8f로 치환되었다는 말이기 때문이다.
table = str.maketrans('0d318f', '67420a')
이제 제법 노래 가사처럼(?) 보인다..
이제 첫 문자로 사용 가능한 문자인 310dc84 중 c,4가 남았다. 그중 4는 한 종류가 4번밖에 쓰이지 않았고 c는 다양한 문자가 여러번 사용되었기 때문에 c가 영어대문자의 나머지부분을 나타내는 5로 치환되었을 것이라고 생각했고 그럼 자연스럽게 4는 3으로 치환되었을 것이다. 이를 역연산하여 적용하면,
table = str.maketrans('0d318fc4', '67420a53')
이제부터는 지금까지 해독한 암호문을 기반으로 단어 기반으로 역추적을 시작해야 한다.
예를 들면, Tne stirs ire 은 The stairs are 로 추측 할 수 있고, X-MAS가 이번 CTF의 대주제이므로
Cnrgst wis 를 Christ mas 로 추측 할 수 있다.
결정적으로, 마지막 줄을 보면 Tne feig gs 는 The flag is 일 것이다!
(처음 추측했던것과 달리 노래 제목이 FLAG와 연관있지는 않았다 ㅋㅋ ㅠ)
위와같이 추측 및 역연산을 반복적으로 적용시키면 최종 플래그를 획득 할 수 있다.
table = str.maketrans('0d318fc4e95a726b', '67420a5381cd9ebf')
FLAG = xmaswasneverasgoodasitisthisyear
반응형'CTF > X-MAS CTF 2020' 카테고리의 다른 글
[Clear] X-MAS CTF 2020 Comfort Bot Writeup (0) 2020.12.23 [Clear] X-MAS CTF 2020 flag_checker Writeup (0) 2020.12.22 [Clear] X-MAS CTF 2020 Santa's consolation Writeup (0) 2020.12.21 [Clear] X-MAS CTF 2020 PHP Master Writeup (0) 2020.12.21 [Clear] X-MAS CTF 2020 FORMULA TRANSLATION NOVICE Writeup (0) 2020.12.20