워게임/CodeEngn

[CodeEngn] Crypto Analysis L02

name2965 2022. 7. 4. 02:55
728x90

 

 

 

 

이번 문제는 조금 어려워보입니다.

 

암호테이블의 갯수가 26개이므로 알파벳에 대응하는 암호테이블로 보입니다

 

한번 나열해보면

 

 

 

다음과 같습니다.

 

알파벳과 대응되는 문자열을 찾아보면 q 와 g가 c 와 d로 대응 되는것 말고는 단서가 없습니다.

 

 

 

나머지 자리를 알 방법은 브루트포싱을 제외하면 딱히 없어보입니다.

 

이러면 남는 자리에 들어갈수있는 알파벳은 e,h,o,r,s,t 입니다.

 

3번째 자리와 7번째 자리가 같다는것을 고려해서 브루트포싱 알고리즘을 짜야합니다.

 

 

#include <stdio.h>
#define CHAR_COUNTA 6

int main()
{
	char str[10] = "?????c?d?";
	char chr[6] = { 'e','h','o','r','s','t' };
	for (int i = 0; i < CHAR_COUNTA; i++) {
		for (int j = 0; j < CHAR_COUNTA; j++) {
			for (int k = 0; k < CHAR_COUNTA; k++) {
				for (int l = 0; l < CHAR_COUNTA; l++) {
					for (int m = 0; m < CHAR_COUNTA; m++) {
						for (int n = 0; n < CHAR_COUNTA; n++) {
							if (i == j || i == k || i == l || i == m || i == n || j == k || j == l || j == m || j == n || k == l || k == m || k == n || l == m || l == n || m == n)
								continue;
							str[0] = chr[i];
							str[1] = chr[j];
							str[2] = chr[k];
							str[3] = chr[l];
							str[4] = chr[m];
							str[6] = chr[k];
							str[8] = chr[n];
							printf("%s\n", str);
						}
					}
				}
			}
		}
	}
}

 

일단 당장 제가 생각할수 있는 브루트포싱 알고리즘은 이정도입니다 ㅠㅠ

 

그런데 이렇게 최대한 조건을 간소화 시켜도 여전히 브루트포싱으로 나오는 문자열이 많아서

뭐가 정답인지 알기 힘들었습니다.

 

그런데 이 프로그램을 통해서 나온 문자열들을 보다보면

 

 

 

 

다음과 같이 뒤에 4글자가 코드라고 되어있는 문자열들이 심심치않게 눈에 띕니다.

그래서 저는 한번 이 뒤에 4자리가 code이고 그렇다면 3번째 자리도 o일것이므로 

이걸 기반으로 코드를 다시 짜봐야겠다는 생각이 들었습니다.

만약 이게 맞다면 경우의수가 훨씬 줄어들어 판별하기 쉬울것이기 때문이지요.

 

그렇게 해서 나온 코드는 다음과 같습니다.

 

#include <stdio.h>
#define CHAR_COUNTA 4

int main()
{
	char str[10] = "??o??code";
	char chr[CHAR_COUNTA] = { 'h','r','s','t' };
	for (int i = 0; i < CHAR_COUNTA; i++) {
		for (int j = 0; j < CHAR_COUNTA; j++) {
			for (int k = 0; k < CHAR_COUNTA; k++) {
				for (int l = 0; l < CHAR_COUNTA; l++) {
					if (i == j || i == k || i == l || j == k || j == l || k == l)
						continue;
					str[0] = chr[i];
					str[1] = chr[j];
					str[3] = chr[k];
					str[4] = chr[l];
					printf("%s\n", str);
				}
			}
		}
	}
}

 

 

이 프로그램을 실행시키면

 

 

 

다음과 같이 문자열의 경우의수가 확 줄어든다는것을 알수 있습니다.

 

이제 이 중에서 가장 의심스러운 문자열을 찾아보면

 

 

 

 

이 문자열이 가장 의심스럽 습니다.

 

그러므로 이 문자열이 정답입니다.

 

 

728x90

'워게임 > CodeEngn' 카테고리의 다른 글

[CodeEngn] Basic RCE L13  (0) 2022.07.06
[CodeEngn] Pro RCE L01  (0) 2022.07.04
[CodeEngn] Crypto Analysis L01  (0) 2022.07.03
[CodeEngn] Basic RCE L12  (0) 2022.07.03
[CodeEngn] Basic RCE L11  (0) 2022.07.03