2013년 5월 16일 목요일

Windbg 툴을 이용한 자바 스크립트 난독화 푸는 방법

Windbg 툴은 커널단에서 디버깅이 가능하게 해주는 툴입니다.

해당 툴을 이용하면 난독화 해제가 가능합니다.

인터넷 익스플로러 웹브라우저에서는 jscript.dll에서 제공해주는 함수 - COleScript::Compile - 를 통해서 자바 스크립트 코드를 해석하여 화면에 출력해줍니다.

자바 스크립트 코드가 제아무리 심하게 난독화 되어 있더라도 해당 코드는 인터프리터 방식으로 해석되어 실행되어지기 때문에 결국에는 난독화가 풀린 코드가 실행되어 지는 것입니다. 이처럼 코드를 해석하는 함수가 바로 COleScript::Compile 입니다.

우리는 Windbg 툴을 이용하여 jscript.dll의 COleScript::Compile 함수에 조건부 브레이크포인터를 건뒤 인자를 확인하는 방법으로 난독화가 해제된 코드를 확인 할 수 있습니다.

다음과 같습니다.

1) 먼저 확인할 난독화 자바 스크립트 코드입니다.



2) iexplorer.exe를 이용하여 해당 HTML 문서를 실행시킵니다. 그렇게 하면 해당 스크립트 코드를 실행할 것인지 묻는 경고창이 보입니다. 이때 Windbg 툴을 이용하여 iexplorer.exe 프로세스를 Attach 시킵니다.

3) iexplorer.exe 프로세스가 Attach 한 다음, Windbg툴의 Commmand창에 다음과 같은 명령을 내립니다.
bu jscript!COleScript::Compile

- 위의 명령은 jscript.dll 파일의 COleScript::Compile 함수에 브레이크 포인터를 거는 것입니다.
그렇게 한 다음 해당 HTML 문서를 실행시키면 다음과 같이 브레이크 포인터가 걸린 것을 확인 할 수 있습니다.



그러면 이번엔 다음과 같이 명령을 줍니다.
bu jscript!COleScript::Compile "dt wchar_t* esp+8; gc"

- 위의 명령은 전에 내린 명령과 동일하게  jscript.dll 파일의 COleScript::Compile 함수에 브레이크 포인터를 거는 것이지만, 조건부 브레이크 포인터를 거는 것입니다.
조건부? 무슨 조건일까요? esp 레지스터의 0x8h 위치의 값(해당 값의 타입은 wchar_t*)을 출력해주라는 것입니다. 해당 값은 바로 우리가 원하는 난독화가 해제된 코드입니다.
다음과 같습니다.

이러한 방법을 이용하면 어떤 난독화 코드든 인터넷 익스플로러 웹브라우저에서 실행가능한 코드라면 무엇이든지 난독화가 풀린 코드를 확인할 수 있습니다.

이 아이디어는 실제로 몇해전 블랙햇 컨퍼런스에도 소개된 바 있습니다. 실제로 해당 아이디어를 이용한 툴도 존재하지만, 특정 인터넷 익스플로러 웹브라우저 버전에서만 동작합니다.
최근 나온 난독화 자바 스크립트는 해당 버전에서는 실행이 안되므로 그 툴은 현재 유용하지 않더군요. 따라서 해당 툴을 고쳐서 사용해야 하는데 고치는 방법은 결론부터 말하자면, jscript.dll 파일의 COleScript::Compile 함수의 주소를 자신이 사용하는 웹브라우저 버전에 맞게 고쳐줘야합니다. 그러면 해당 함수를 inline hooking하여 난독화 해제된 코드를 파일로 저장하여 볼 수 있습니다.
이렇게 고쳐서 사용하고 싶지만 현재 프로그래밍 실력이 부족하여 그리할 수없습니다.
혹시 이 글을 읽고 계신분중에 해당 툴에 관심있으시면 댓글에 E-Mail 주소를 남겨주시기 바랄께요. 그럼 이만, 부족한 글을 읽어주셔서 감사합니다.

댓글 6개:

  1. 멋진 생각입니다!! 툴이 구현된다면 디코딩에 걱정이 없겠는데요 +_+

    답글삭제
  2. 가상webkit을 구현해서 후킹하는 방법으로 모든 난독화를 푸는 시스템을 생각했었는데 (urlquery.net 에서 구현한 것 처럼) 이런 방법이 있을 줄 상상도 못했군요. 좋은 정보 감사합니다.

    답글삭제
  3. 재현에 관심있으시면 ie5버전에 적용된 후킹 소스 공유해드릴께요

    답글삭제
  4. http://binaryhax0r.blogspot.kr/2012/10/windbg-way-to-decrypt-obfuscated-js.html

    번역 잘하시네요~

    답글삭제
    답글
    1. 번역한글은 아니구요
      해외발표자료보구 정리해둔겁니다 링크해주신 내용이 좀더 자세한듯하네요 감사합니다

      삭제