watch out (POX 2016 본선 - analysis)
본선 문제 중 analysis라는 문제가 있었는데 백업본을 받아서 한번 풀어 보았다.
문제는 바이너리 파일 하나가 주어지고 다음과 같다.
주어진 파일을 모두 분석하여 키값이 숨겨진 URL을 찾으시오
바이너리 파일을 HxD로 열어보면 다음과 같다.
< 문제 파일 hex >
그냥 보았을 때 익숙한 시그니쳐가 아니다.
문제를 풀 때 알 수 없는 바이너리 파일이 나오면
1. 시그니쳐를 구글링 해본다 (00 ~ 04 또는 00 ~ 08까지)
-> 시그니쳐가 나오면 그에 상응하는 변환, 실행, 해제 방법이 있기 때문에 무조건 먼저 해 본다.
2. 파일 카빙을 해 본다.
-> 문제에 의도적으로 다른 파일의 바이너리를 숨겨놓기 때문에 이 방법도 시도 해 본다.
보통 위 두가지 방법으로 문제 파일이 어떤 종류인지 판단을 하는데 이 문제는 두 방법 모두 가능하다. 하지만 카빙은 조금 더 복잡..
문제 파일의 시그니쳐인 '1F 8B 08 00' 을 구글에 검색을 해 보면 gz파일인 것을 알 수 있다.
< 문제 파일 시그니쳐 - forensic-proof >
gz인 것을 알았으므로 문제 파일의 확장자를 .tar.gz로 바꾸고 압축을 해제하면 'malscript'라는 폴더와 함께 5가지 파일이 나온다. 보면 난독화 된 js파일이 있다. 이 난독화된 js를 실행시키면 'disk:\User\계정명\' 하위에 rad~tmp.exe 라는 파일이 생성되는데 열어보면 404 not found 메시지가 적혀 있을 것이다.
따라서 무언가 동작을 하긴 한다는 얘기 이므로, 이 소스코드의 난독화를 해제 해 주면 된다.
난독화 방법은
1. notepad ++을 이용한 문자열 치환
2. 불필요한 문자열 제거 및 정렬
3. 자주 이용되는 함수, 변수명 변환
4. 함수 사용 최소화 및 리턴값으로 변환
이 방식을 사용하였다.
간단히 말하면 js파일은 스크립트를 이용하여 윈도우 쉘을 띄우고, 특정 URL을 통해 실행 파일을 다운로드 받는다.
하지만 지금은 그 파일이 존재하지 않으므로 다운받을 수 없어 위에서 404 Not Found 가 출력 된 파일이 생성 된 것이다.
난독화 해제 중
AXSZWYG("8AJ8EFBEWAFKB4BADYA9NF3B8EOB5HB8NB1IB1C", BRHPERXEB)
이와 같은 형태가 많이 나온다. 이는 AXSZWYG라는 함수를 이용해서 위 바이너리 값에서 문자열을 추출한다.
가령 CreateObject나 Open등의 함수명, 파라미터 명 들이 이를 이용하여 만들어 진다.
이 부분만 모두 난독화 해제 해 주면 간단한다.
때문에 AXSZWYG함수를 파이썬으로 다시 작성을 하였고, 이를 이용하여 위와 같은 형태의 바이너리 들을 모두 일반 문자열로 변환해 주는 방법을 사용하였다.
파이썬 소스는 다음과 같다.
어디까지나 3f~ 소스가 기준이기 때문에 다른 소스코드에 적용을 하려면 inp_int를 변경해 주어야 한다.
그 결과로 나온 js소스 중 하나의 난독화 해제는 다음과 같다.
난독화 해제가 익숙한 사람이라면 금방 풀 수 있는 문제 인 것 같다.
'CTF | wargame' 카테고리의 다른 글
Hack The Vote 16 - topkek (Crypto, 2-10 진법) (0) | 2016.11.12 |
---|---|
Hack The Vote 16 - warp_speed (jpg 파일 변환) (0) | 2016.11.11 |
POX14 - Crypto-1 (파이썬 디컴파일, CBC블록암호, 소스 재정렬) (0) | 2016.10.10 |
TWCTF16 - glance (png 픽셀 조정, gif 이미지 추출) (0) | 2016.09.06 |
TWCTF16 - super_express (Crypto) (0) | 2016.09.06 |