Encrypt By Dadong's JSXX 0.41 VIP 이란 주석을 가지고 있는 자바스크립트 악성 코드가 근래 들어 많이 보인다고 한다.

샘플 : 

(해당 샘플을 사용하고 생기는 책임은 모두 다운로드 받는 본인에게 있다는 걸 명심하세요, 비밀번호 : virus)

중국에서 만든 난독화 코드인데 dadong을 거꾸로 하면 gondad가 되는데 이는 중국어로 공격이라는 뜻이란다.

해당 난독화 코드는 사실 난독화를 풀지 않고도 분석이 가능하다.

해당 글에서는 해당 악성코드를 해결하는 두가지 방법을 제시 할 것이다.

하나는 아주 간단하게 쉘코드만을 얻어와 쉘코드 분석을 통해 추가적으로 어떠한 행동을 하는지 파악하는 방법이고 또 하나 방법은 난독화 코드 자체를 해독하는 방법이다.

일단은 난독화 코드 자체를 해독하는 방법부터 알아보자.

[난독화 코드 해독 방법]
샘플 코드는 아래와 같이 생겼다.

[그림 1 - 샘플 html 파일 윗 부분]

 [그림 2 - 샘플 html 파일 아랫 부분]

[그림 3 - i.js 파일 코드]
 
[그림 2] 부분이 실제 난독화 코드 부분이고 [그림 1]은 midi 취약점에 관련된 부분이다. 빨간 박스 부분에 주석이 보이는데 이 주석 때문에 dadong 난독화 스크립트라고 부른다.

일단 엄청나게 숫자가 많은 부분은 실제 어떠한 행위를 하는 코드 부분이고, 그 다음부터 이어지는 코드들이 어떠한 행위를 하는 코드를 해독하여 주는 부분이다. 해당 코드를 임의로 정렬 해 보았다.

[그림 4 - 난독화 코드 복호화 수행 코드 임의 정렬]

딱 봐도 엄청나게 보기가 복잡하다. 하지만 차근차근 보다보면 해당 코드가 어떻게 복호화 되는지 알 수 있는데, 소스를 한줄씩 분석하다 보면 1번 박스 코드에서 현재 코드(난독화 코드를 풀어주는 복호화 수행 코드)들을 아스키 값으로 변환하여 모두 더하는 것을 볼 수 있다. 그리고 2번 박스에서 아스키값들을 모두 더해 저장한 변수를 key 값으로 사용하여 xor 연산등을 통해 어떠한 행위를 하는 코드를 복호화 해 주는 것을 볼 수 있으며 3번 박스에서 그 코드를 실행하는 것을 볼 수 있다.
복호화 된 코드를 보기 위해 alert나 document.write를 이용하면 되는데 여기서 주의해야 할 점이 있다.
key로 현재 코드들의 아스키 값 총합을 사용하기 때문에 이 총합이 틀려지면 key 값도 달라져 복호화 결과 또한 달라지게 된다. 그렇기에 3번 박스에 있는 KDRhr0 이 함수와 아스키값이 동일한 어떠한 함수를 정의해 줘야 한다. KDRhr0 와 아스키값이 동일하려면 r0==162 라는 조건을 충족하는 다른 아스키 조합을 찾으면 된다. 기본적으로 r 자리는 +1 증가를 시켜주고, 0자리는 1 감소 시켜주면 된다. 필자는 m5 라는 값을 사용 하였다. 아래와 같이 수정을 하게 되면 복호화 코드가 나타나게 된다.

[그림 5 - 복호화 코드 수정]

KDRhm5 = alert 이 부분은 직접 alert 코드를 대입하기 위하여 임의로 정의한 부분이고 아래 박스 부분은 alert가 적용되게 끔 함수 이름을 변경 시켜 준 것이다. 위 코드를 실행하게 되면 아래와 같이 나온다.

 [그림 6 - 난독화 해독 결과]

난독화가 해독되었으나 아직은 완벽하게 된 것은 아니다. 아래에 있는 몇가지 줄로 인해 위에 있는 쉘코드가 정렬, 치환되고 실행이 된다. 그 과정은 글이 너무 길어지므로 생략하겠다. 대부분 i.js 파일에 있는 변수들로 인해 치환된다.

또 쉘코드 분석은 나머지 방법 소개하고 그 뒷부분에서 공통적으로 이어가겠다.

참고자료 : http://www.kahusecurity.com/2012/chinese-pack-using-dadongs-jsxx-vip-script/ 


[쉘코드 바로 얻는 방법]
대부분의 악성코드들은 unescape를 하는데 해당 난독화 코드의 쉘코드 또한 unescape를 사용한다. 이 부분을 alert로 바꾸어주게 되면 난독화가 해제되고 쉘코드를 unescape 하는 과정에서 alert를 만나 unescape 하기 전 쉘코드를 보여주게 된다. i.js 파일에 unescape를 정의 해 놓은 변수가 있는데 이 부분을 alert로 변경하여 주면 된다.

 [그림 7 - unescape 되기 전 쉘코드]

첫번째 방법에서 치환되고 정렬된 결과와 동일하다. 그러나 아직 UCS2 문자가 있기 때문에 이 문자들을 hex 값으로 바꾸어 주어야 한다.

[그림 8 - UCS2 값 변경 방법]

변경하고 shellcode2exe를 이용하여 exe 파일로 만들고 올리디버거로 열어 분석하다보면 아래와 같은 부분을 볼 수 있다.

[그림 9 - XOR 연산 수행 부분]

사실 프로그램을 실행하면 무언가 동작은 하지만 분석을 해보면 그다지 하는 행동이 없어 보인다. 코드를 보면 다시 한번 XOR 연산으로 복호화를 수행 하는걸 알 수 있는데 이 또한 malzila에서 가능하다. XOR 코드를 보면 key 값은 0xBD 인 것을 알 수 있다.

 [그림 10 - XOR 복호화 수행]

복호화를 하게 되면 또다른 hex 값들이 나온다. 이 값들을 아래와 같이 확인해보면 추가적인 행위를 파악 할 수 있다.
 

 [그림 11 - 쉘코드 분석]

제일 마지막에 어떠한 URL이 있고 그 URL을 통해 어떠한 exe 파일을 받는 것을 알 수 있다.

 * 참고 : 현재는 해당 주소에 접속이 되지 않고 해당 주소를 검색하면 악성파일 유포지 인 것을 쉽게 확인 할 수 있다.

  1. 트라 2012.05.26 23:42

    역시 마제스트님 이군요 ^^ 만약 i.js 참조 하는부분이 없는 코드면 alert 부분을 어떻게 매칭시켜야 될까요? 다똥 0.41 구해서 보는데 오늘 하루 말렸네요 ㅠㅠ

    • Favicon of https://maj3sty.tistory.com BlogIcon MaJ3stY 2012.05.27 20:10 신고

      음 여러가지 방법이 생각나는데 이건 모두 구조에 따라 다 달라지는 방법들뿐이네요 ㅠㅠ...

      아무래도 소스를 봐야 할듯 ㅎㅎ 아무리 난독화 코드라고 하더라도 결국은 풀리는 곳이 있으니 시간만 있으면 충분히 해결하실거라 생각이 드네요 ^^

+ Recent posts