CTF | wargame

POX14 - Crypto-1 (파이썬 디컴파일, CBC블록암호, 소스 재정렬)

nopdata 2016. 10. 10. 09:01


이번에 pox 준비를 하는데 좀 도우라고 해서 crypto 문제를 한번 봤다.

14년도 본선 암호 문제이다.


● 문제 확인


< 파일 목록, 암호문 >

주 파일이름은 I_Love_SEED.py이며 위처럼 암호문이 txt 파일로 제공된다.

문제 소스코드는 다음과 같다.



< I_Love_SEED.py 내용 >

코드는 간단하다. I_Love_SEED.py소스가 압축 파일에서 같이 제공된 SEED_only_enc.pyc를 import하여 사용한다.

key는 0~65536 사잇값을 랜덤하게 선택하여 문자열로 바꾼 후 16자리를 맞춘다.

예를들어 선택된 값이 16이라고 한다면 결과로 나오는 key는 '0000000000000016'가 된다.


다음으로 이제 암호화에 적용될 key를 SeedRoundKey 함수를 이용하여 만든다. 이는 SEED_only_enc에 존재한다.

해서 cbc_encrypt 함수를 이용하여 암호화를 하면 끝이다.


● 보다 상세하게...

위에서 힌트로 주어진 것은 SEED암호화, cbc 블록 암호라는 것이다.

< SEED 암호 >

SEED 암호 알고리즘은 우리나라에서 제작한 블록 암호 알고리즘이다.

블록암호, SEED에 대하여는 다음에 다시 쓰도록 하고 간단히 말하자면 블록암호는 평문을 일정 블록(크기)로 나누어서 암호화 시키는 방법이다. 위 소스코드에서 보면 str(keyn).zfill(16)을 보아 16자리라고 판단하면 된다.

물론 상세한 cbc_encrypt함수를 확인해야 명확해 지긴 하지만..


cbc암호는 블록 암호의 방법중 하나로 Cipher-Block-Chaining을 의미한다. 이전 블록의 암호화 결과가 다음 블록의 암호화에 영향을 미치는 것이다.


< CBC 블록 암호화 >

뭐.. 보다 상세한건 나중에 다루기로..



● pyc 디컴파일

이제 대충 단서는 모았지만 중요한 cbc_encrypt 함수의 동작을 정확히 파악하지 못했다.

이는 SEED_only_enc.pyc를 디컴파일해서 소스코드를 확인하면 된다.

uncompyle2를 사용하여 디컴파일을 진행하면 된다.


< cbc_encrypt 함수 >

SEED_only_enc를 디컴파일 한 후 cbc_encrypt 함수를 보면 위와 같다.

16자리씩 끊어서 SeedEncrypt 함수를 이용하여 xOutput의 데이터를 k의 key를 이용하여 암호화한다.

암호화에는 이전에 암호화한 데이터의 암호화 값을 이용한다.


< CBC 블록 암호화 >

위에서 봤던 CBC 블록 암호화이다. cbc_encrypt 함수와 비교를 해 보면 Initialization Vector는 xInput의 초기화값 [0, ... 0]을 가지며 그림과 동일하게 동작한다.


● 풀이

이제 복호화 소스를 작성해야 하는데 알아야 하는 필요 정보는 다음과 같다.

1. 암호화에 사용된 key값 정수 keyn


여러가지 방법이 있겠지만 0~65536의 값은 그리 큰 크기가 아니기 때문에 전수조사 방법을 사용 하였다.

첫 암호문의 0~16자리의 문자열을 key값을 바꾸어 가며 확인을 해 보면 된다.

단, 65536의 문자열을 모두 확인할 수 없으므로, 복호화된 값은 아스키 코드값(128이하)이라 가정을 하고 진행한다.


< key 획득 소스 >


< key 획득 결과 >

복호화 결과 문자열이 모두 아스키 코드 범위인 것은 위 사진 처럼 2개로 압축할 수 있고, 딱 보아도 key 숫자값이 54008일 때

답을 얻을 수 있다는 것을 알 수 있다.



< 풀이 소스 >


< 풀이 결과 >


자체적으로 만든 암호 알고리즘이 적용된 문제가 아니였기 때문에 문제 자체는 그리 어렵지 않은 것 같다.

파이썬 소스 분석 능력, 재조합 능력이 약간 필요한 문제가 아니였나 싶다.



ref : https://seed.kisa.or.kr/iwt/ko/sup/EgovSeedInfo.do

https://github.com/wibiti/uncompyle2

solution : solution.zip