[XCZ.KR] 26번 풀이
Wargame/XCZ.KR

[XCZ.KR] 26번 풀이

문제 종류 - Cryptography
사용한 툴 - Sublime Text 3 (Python 3.x)
Flag, Hint, 정답 형식

flag: ?

hint: Message: Yh9/=-^:86/f87Y?]-@L}<_E|*1/=-Xi!"Hx865C|-}:|*DL*G_i86/f868FX(@g@-Lh|)=D}_93@_18@g9,*3YC$(@P

정답 형식: ?

 

풀이

문제에 들어가면 인코딩 사이트가 주어진다.

저기 Encode input 값 안에 a를 넣어보자.

그럼 이번엔 1은 어떨까?

그럼 e는?

마지막으로! 를 넣어보자.

한 자리의 input 값을 입력받으면 뒤에 PP라는 값이 따라붙는다.

계속 생각해보다가 Padding value가 아닌가 싶었다.

이번에는 aa를 입력해보자.

다시 aaa를 입력해보자.

마지막으로 aaaa를 입력하고 규칙을 찾아보자.

지금까지 나왔던 값들의 Cipher text를 정리해 보겠다.

규칙을 찾아보면 다음과 같다. (왼쪽이 Plain Text, 오른쪽이 Cipher Text)

 

1. Plain Text와 Cipher Text를 byte로 변형하면 다음과 같다.

   XXXXXXXX | XXXXXX XXXXXX XXXXXX XXXXXX

   한마디로, Plain Text를 6bit씩 끊어 읽어 Cipher Text를 생성한다.

2. 6bit를 10진수 값으로 읽어 특정한 테이블을 거쳐서 암호화가 된다.

3. 변환 과정에서 X값이 남아있을 경우, 0으로 취급하며 0은 P라는 패딩으로 처리한다.

ex) aa = 010000 010110 0001XX XXXXXX (6bit씩 끊어 읽음)

            24        22        4         0       =>    =U4P

4. Plain Text는 3자리가 최대이므로 만약 넘게 될 경우 다시 Plain Text 카운트가 0으로 초기화된다.

ex) aaa | =U5:  However, aaaa | =U5:=^PP

5. 6bit씩 끊어 읽으므로 테이블 value의 개수는 $2^6-1$이다.

 

이 정도면 문제를 푸는데 어렵지 않을 것이다.

처음에는 Bruteforce를 하려 했으나 그냥 노가다 뛰기로 했다.

지금 문제를 푼 시점에서는 그냥 브루트포스가 편했을 듯... 하다. 

뭐 그래도 풀긴 풀었으니까..

이런 식으로 테이블을 구하던 도중 테이블이 어느 정도 규칙성이 있다는 것을 발견했다.

규칙을 발견해 약 70% 정도의 테이블 값은 쉽게 찾을 수 있었다.

나머지 29%는 위에 사진처럼 대입해 보면서 찾았다.

남은 1%는 밑에서 설명하겠다.

테이블 예시

이제 해당 테이블을 참고해 코드를 짜 봤다.

테이블 값을 딕셔너리로 옮겼다면 이제 대충 코드를 설명해보도록 하겠다.

text = "주어진 Cipher Text"이다.

첫 번째 i for문을 돌면서 text를 4개씩 쪼개 array에 저장한다.

이제 array[0 ~ 3]의 값을 binary string으로 바꿔 n_type에 저장하고 n_array와 합친다.

최종 n_array는 다음과 같아진다.

array -> n_array

그리고 w for문을 돌면서 n_array를 8bit로 쪼개 ASCII 값을 출력하게 된다.

이렇게 하면 모든 Key 값이 완성된다. 그러나 다음과 같은 반례가 존재한다.

이렇게 ASCII로 변형이 불가능한 값은 모든 Key 값을 구하면 이게 뭔 값인지 알게 될 것이다. ㅎㅎ

 

노가다 뛰어 푼 결론.

그냥 브루트포스 하자.

'Wargame > XCZ.KR' 카테고리의 다른 글

[XCZ.KR] 34번 풀이  (0) 2020.05.14
[XCZ.KR] 35번 풀이  (5) 2020.05.13
[XCZ.KR] 36번 풀이  (0) 2020.05.05
[XCZ.KR] 32번 풀이  (0) 2020.05.02
[XCZ.KR] 30번 풀이  (0) 2020.05.02