이번에 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
'CTF | wargame' 카테고리의 다른 글
Hack The Vote 16 - warp_speed (jpg 파일 변환) (0) | 2016.11.11 |
---|---|
POX16 본선 - watch out (난독화 해제, WScript.Shell) (0) | 2016.11.11 |
TWCTF16 - glance (png 픽셀 조정, gif 이미지 추출) (0) | 2016.09.06 |
TWCTF16 - super_express (Crypto) (0) | 2016.09.06 |
Hack-me / Apollo 11 moon hoax (프리메이슨) (0) | 2016.07.22 |