NOTICE


 Gonda Pack Exploit 분석 방법에 대해 알아보도록 하겠습니다.


 분석에 사용한 샘플 파일과 분석 도구 정보는 다음과 같습니다.


 - 샘플 파일 정보

 파일 이름

 rfJuOj5.html

 파일 크기

 14,423 byte

 MD5

 4D02EE20D1E9F2614299BF770A9E3C0A


 - 분석 Tool 정보

 파일 이름

파일 이름

Notepad++.exe

 OllyDBG.exe



1. 소스 코드 확인


 rfJuOj5.html 파일에는 Gongda Pack 기법으로 난독화 된 스크립트 코드가 삽입되어 있습니다.


[그림 1.1.] rfJuOj5.html 파일에 삽입되어 있는 난독화 스크립트 확인


 스크립트 코드를 보기 쉽게 정리하면 아래 [그림 1.2.]과 같습니다. 여기서 if( ) 코드가 먼저 실행됩니다. 이로 인해 파일 내에 존재하는 모든 xpiIqz5 문자열과 pQyfRvo7 문자열이 각각 unescape와 eval이라는 의미를 지니게 됩니다. 분석 편의를 위해 모든 xpiIqz5,, pQyfRvo7 문자열을 각각 unescape와 eval로 바꿔줍니다.


[그림 1.2.] rfJuOj5.html 파일 스크립트 코드 정리



2. 난독화 코드 해제


 if( ) 코드 동작이 끝나면 '난독화 해제코드 실행 함수'가 실행됩니다. pQyfRvo7 문자열을 eval로 수정한 '난독화 해재코드 실행 함수'를 살펴보면 다음과 같습니다. 이 코드를 보기 쉽게 정리하면 'eval(JbngCY8);'이 됩니다.


[그림 2.1.] 난독화 해제코드 실행 함수


 그럼 이번에는 JbngCY8 변수에 저장되어 있는 값을 보기 쉽게 정리해보겠습니다. 아래 [그림 2.2.]는 JbngCY8변수에 있는 코드 중에서 단순화 시킬 수 있는 부분을 수정하는 과정입니다. 먼저 변수 내에 있는 모든 'jSxDzx6', 'ORCaNm4

', 'zbLd3' 문자열을 각각 'length', 'test', 'replace'로 바꿔줍니다. 아래 if 조건문에 포함되어 있는 '\'는 replace( )에 의해 ''으로 바뀝니다. 따로 설명하지 않았지만 if 조건문 앞에 replace( )가 있습니다. 마지막으로 unescape 호출 코드를 복호화합니다.


[그림 2.2.] JbngCY8변수에 있는 코드 단순화


 모든 정리가 끝나면 아래와 같은 코드를 확인할 수 있습니다. 이 코드가 난독화 된 데이터를 해제하는 코드입니다. 코드에 대한 설명을 간단히 하겠습니다. 먼저 hlyq6 사용자 함수가 선언되고 try – chatch 문이 실행됩니다. 이때 eval(‘hlyq6();’);이 실행되면서 결과적으로 hlyq6 함수가 동작합니다.


[그림 2.3.]  JbngCY8 변수에 저장되어 있는 코드 단순화


 여기서 DDUyR4, eOywxE4, VDtLcyh4는 각각 0, 1, 2를 의미합니다. 적절히 바꿔주고 다시 살펴보겠습니다.


[그림 2.4.] DDUyR4, eOywxE4, VDtLcyh4 코드 수정


 정리된 코드에 대해 설명하겠습니다. 먼저 [그림 2.5.]를 확인하고 그 밑에 코드 설명을 보시기 바랍니다.


[그림 2.5.] 난독화 해제 코드 단순화


 1. hlyq6 함수를 실행합니다.

 2. hlyq6 함수 실행되면서 for 반복문이 동작합니다. 반복문으로 인해 [그림 1.2.]에서 난독화 해제 코드가 저장되어 

    있던 JbngCY8 변수의 길이 값만큼 반복해서 복호화 키를 만들 때 필요한 키 값이 구해집니다..

    ※ 변수 길이 값이 일치하지 않으면 정상적인 키 값이 생성되지 않으므로 코드에 JbngCY8 변수를 추가해주어야 

       합니다.

 3. 정확히 값을 만들어내기 위해서는 for 반복문이 2번 동작해야 하기 때문에 강제로 에러를 발생시킵니다.

 4. catch 문의 코드가 실행되면서 AJomWz4 변수가 만들어지고 hlyq6 함수가 다시 실행됩니다.

 5. 첫 번째 반복문이 한번 더 실행되고 두 번째 반복문이 실행됩니다. 두 번째 반복문은 [그림 1.2.]에서 난독화된 데

    이터가 저장된 변수의 길이 값 만큼 반복해서 복호화 키를 만들고 데이터를 복호화합니다.

    ※ 변수 길이 값이 일치하지 않으면 정상적인 키 값이 생성되지 않으므로 wXxtA4 변수를 추가해주어야 합니다.


 JbngCY8과 wXxtA4 변수를 추가하고 불필요한 코드를 삭제해 단순화하면 [그림 1.8.]처럼 됩니다. 마찬가지로 [그림 1.8.]을 먼저 확인하고 그 밑에 코드 설명을 보시기 바랍니다.


[그림 2.6.] 최종 단순화 코드


1. 4번에서 키를 생성할 때 JbngCY8 변수의 길이 값이 필요하므로 선언해줍니다.

2. 난독화된 데이터로 6번에서 실제 복호화가 이루어집니다.

3. [그림 2.5.]에서 Try-Catch 문을 사용해 4번 코드를 두 번 호출합니다. 적절히 for 문으로 수정해서 4번 코드를 두 

   번 호출되도록 만들었습니다..

4. 복호화 키를 만들 때 필요한 키 값을 구하는 코드입니다.

5. XOR 연산에 필요한 복호화 키 값을 구하는 코드입니다.

6. 실제 데이터 복호화가 이루어지는 코드로 lrwe7 변수에 저장됩니다.


 [그림 2.6.]에서 복호화가 끝나면 마지막 코드 'alert(lrwe7)'에 의해 코드가 실행됩니다. 우리는 복호화된 코드를 추출해야하므로 'alert(lrwe7)'를 'document.write((lrwe7)'수정 한 뒤 코드를 실행시킵니다. 코드를 실행하는 방법은 다양하지만 저는 'TEST.html' 파일로 저장해서 브라우저에 코드가 출력되도록 했습니다.

 난독화가 해제된 코드를 살펴보면 16진수 유니코드로 작성된 Shell Code가 포함되어 있는 것을 알 수 있습니다.


[그림 2.7.] Gongda Pack 난독화가 해제된 코드


 이 값을 16진수 Hex 값으로 변환하고 TEST.exe 파일로 만들어서 분석하겠습니다. Shell Code 분석 방법은 아래 링크를 참고하시기 바랍니다.


[Shell Code] Shell Code를 .exe 파일로 만들어서 분석하기: http://securityfactory.tistory.com/98



3. shell Code 분석


 TEST.exe를 OllyDBG.exe에 올려서 분석하다보면 아래 그림과 같이 EAX에 저장된 주소에서 1 Byte씩 읽어와서 0xBD로 XOR 연산하는 것을 확인할 수 있습니다.


[그림 3.1.] 데이터 복호화 과정 – XOR 연산


 그리고 연산 과정이 끝나면 복호화 된 데이터에서 URL 값을 얻을 수 있습니다. 실제 악성 스크립트가 실행됐을 때 해당 URL에서 ccsc.exe가 다운, 실행됩니다.


[그림 3.2.] 복호화 완료 – URL 확인


 이상으로 'Gonda Pack Exploit 분석 방법'에 대한 포스트를 마치도록 하겠습니다.