CTF | wargame

POX16 본선 - watch out (난독화 해제, WScript.Shell)

nopdata 2016. 11. 11. 16:23

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소스 중 하나의 난독화 해제는 다음과 같다.




난독화 해제가 익숙한 사람이라면 금방 풀 수 있는 문제 인 것 같다.