[11] 난독화를 풀어라!!!

난독화/난독화 강좌 2013. 12. 7. 15:11

[문제] 아래의 3개의 파일과 다운로드 경로가 주어졌다. 해당 파일들을 분석하여 악성코드 다운로드 경로를 찾아보자!

[그림 1] 의심파일 다운로드 확인

 

1. 파일 시그니처(매직넘버) 확인

 

1.1 HxD를 이용한 파일 시그니처(매직넘버) 확인

확장자는 swf 이지만 HxD를 통해 확인 결과 3개 모두 자바스크립트 파일로 확인되었다.

[그림 2] 파일시그니처 확인

 

2. 악성코드 유포지 추가 파일 다운로드

3개의 파일은 모두 js 파일의 형태를 가지고 있으며 각각은 동작할 수 없는 구조였다

3개의 js 파일을 불러 사용하는 메인페이지가 있을 것으로 예상되어, wget을 이용하여 추가 파일을 다운로드 시도해 보았다. 그 결과 4개의 파일이 다운로드 되었는데, 3개는 기존의 파일들이고 나머지 하나는 3파일을 합쳐주는 메인 페이지(index.htm) 였다

[그림 3] wget을 이용한 파일다운로드

 

Index.htm 파일은 3개의 스크립트 파일을 불러와 합쳐주는 간단한 구조였다

[그림 4] main.html 소스코드

 

3. 상세 분석

3.1 난독화 구조도

 - 파일들을 재구성해보면 아래와 같은 구조를 가지고 있다

[그림 5] 구성도

 

    해석을 힘들게 하기 위해 쓰레기 값(사용하지 않는 값)들이 다수 포함되어 있다.

    버퍼 오버플로우를 일으키기 위해 shellcode와 임의의 코드를 조작한다.

    MPEG2TuneRequest 취약점을 이용하여 오버플로우가 일어나고 Shellcode가 동작한다

 

  MPEG2TuneRequest 취약점 공격 관련 정보

 - http://ahnlabasec.tistory.com/337

- http://www.hostinglove.com/bbs/board.php?bo_table=preservation&wr_id=139

 

3.2 Shellcode 분석

MPEG2TuneRequest 취약점 공격을 하는 목적은 결국 Shellcode 부분을 실행하기 위해서다. 공격자의 의도를 파악하기 위해서 Shellcode 분석을 하자

 

일반적으로 스크립트에 Shellcode 포함된 경우

    HEX 값으로 변환 후 스트링(문자) 값 확인

    HEX 값으로 변환하고 말질라를 이용하여 Xor Key 값을 확인 및 Xor 연산 후 스트링 값 확인

위의 두 가지 방법으로 확인 할 수 있다.

 

* 이러한 패턴의 shellcode의 경우 일반적으로 특정 웹사이트에 접속 후 추가 악성코드를 다운받는 행위를 한다. 때문에 http 문자열을 이용하여 Xor key값을 찾는다

 

3.2.1 Malzilla를 이용한 Shellcode 분석

Shellcode를 입력하고 UCS2 To Hex 버튼을 눌러 Hex 값으로 변환한다

[그림 6] Shellcod to HEX

 

USC2 to Hex: %u를 지우고 4자리 기준으로 앞 두 자리와 뒤 두 자리를 바꾸어 주는 기능

 

Hex view 탭으로 이동하여 Hex의 스트링 값을 확인한다. ([그림 7] 참조

è  해당 샘플에서는 스트링 값에서 아무것도 확인할 수 없었다

 

XOR 연산하여 스트링 값을 찾아주는 기능을 이용하여 key 값을 찾아본다

è  해당 샘플에서는 Key 값이 확인되지 않았다

[그림 7] Malzilla를 이용한 Xor Key값 확인 시도

 

▶ 이 Shellcode는 기본 XOR 변환이 아닌 다른 방법으로 되어 있는 것으로 판단된다

 

3.2.2 Shellcode to EXE (쉘코드를 실행파일로 변환)

Malzilla로 확인되지 않은 경우, Shellcode를 실행파일(EXE)로 만들어 동적 분석을 하는 것이 좋다.

이때 리버싱 스킬이 필요한데 Shellcode의 경우는 특성상 짧고 간결하게 제작되어 있기 때문에 약간의 분석 스킬만 있다면 대부분의 샘플은 분석 가능하다

 

아래주소는 Shellcode EXE 파일로 변환해 주는 가장 유명한 사이트이다

- http://sandsprite.com/shellcode_2_exe.php

 

사이트에 접속 후 [그림 7]처럼 Shellcode를 빈칸에 넣은 후 submit 버튼만 누르면 shellcode.exe_ 파일로 변환해 준다

[그림 8] Shellcode to EXE 사이트

 

3.3 shellcode.exe_ 파일 분석

 

3.3.1 PE 구조 확인  

실행파일을 Stud_PE를 이용하여 간단히 살펴보면 Silvana로 패킹이 된 것을 확인할 수 있다

[그림 9] silvana 패킹 확인

 

3.3.2 Ollydbg를 이용한 동적 분석

Shellcode.exe_파일을 Ollydbg로 열면 [그림 10]를 확인할 수 있다

[그림 10] Ollydbg open

 

[그림 10]에서 XOR 연산하는 루프문을 찾을 수 있다. , 반복해서 특정 값을 XOR 연산한다

우리는 이 부분을 자세히 볼 필요가 있다

 

어셈명령어 중 LOOPD ECX값을 -1 하면서 ECX가 제로가 될 때까지 루프를 도는 명령어이다. 그렇다면 루프문이 끝나는 조건인 ECX값은 어디서 구할까?


 

[그림 11] ECX 값 확인

 

[그림 11]의 빨간색 박스 안에 있는 어셈코드를 해석하면 ECX값을 구할 수 있다.

0x00401010주소에 있는 어셈명령어(MOVZX[1])를 해석해보면 ECXAL(B1)값을 복사하고 있다. 하지만 ECX값은 0xB1이 아닌 0x3B1이 된다. 그 이유는, 다음 줄의 0x00401013주소에 있는 어셈명령어(OR) 때문이다. 여기서 유의할 점은 CL이 아닌 CH라는 것이다.

 

 

ECXOR연산을 통해 0x3B1이 되며 하나씩 감소하면서 제로가 될 때까지 루프를 돌게 된다.

[그림 12]에서 EDI (복호화 할 주소)에 특정 값(DL) Xor하는 것을 확인할 수 있다. 이때 Xor 값은 계속 바뀐다 (malzilla에서 xor 값을 못찾는 이유!)

[그림 12] 복호화 구조

 

루프카운터 값이 0이 되면 0x00401140 주소에서 복호화 된 값을 확인 할 수 있다.

[그림 13] Xor 복호화

 

이러한 복호화 과정을 끝나고 나면 최종 다운로드 주소를 확인 할 수 있다.

[그림 14] 최종 악성코드 유포지 확인

 

※ 확인된 URL은 다운로드 되지 않아 추가분석 불가!

 


[1] MOVZX(Move Zero Extend) : MOV 제로

설정

트랙백

댓글

[10] Red Kit 의 재미있는 난독화

난독화/난독화 강좌 2013. 11. 27. 03:56

Red Kit randing page에 사용된 난독화 방법 중 일부를 분석해 보자

 

Red Kit에 대해 간단히 소개하면 Blackhole EK 만큼이나 유명한 Web Exploit Tool Kit으로 자바취약점과 PDF 취약점을 이용한다. Red Kit은 이미 2012년부터 Red Kit을 이용한 악성코드 유포가 국내에서도 발견되고 있다고 한다. 

 

Red Kit관련 자료는 아래의 블로그들을 참조바란다.

Malware Must Die 블로그: http://malwaremustdie.blogspot.kr/2012_12_01_archive.html

Mcafee 블로그: http://blogs.mcafee.com/mcafee-labs/red-kit-an-emerging-exploit-pack

Hakawati Security Lab 블로그:

http://hidka.tistory.com/entry/Redkit-Exploit-Tool-Redkit-Landing-Page에-관한-정보

--------------------------------------------------------------------------------------------------

 

아래는 Red Kit randing page의 소스코드 일부이다. Jar 파일과 PDF 파일을 쉽게 확인할 수 있다.

하지만 작년 자료이기 때문에 해당 파일들을 구할 수는 없었다

[그림.1] Red Kit randing page

 

[그림.2] 는 오늘 난독화 공부를 할 부분이다.

[그림.2] 자바 취약점 난독화 데이터 부분

 

자세히 보면 자바 부분의 value 값에서 이상한  점을 발견할 수 있다. 

이 패턴은 Blackhole EK에서 자바 부분에 난독화된 데이터를 value값으로  삽입하는 것과

비슷해 보였다. 내 생각이 맞다면 jar파일 안에는 이부분을 복호화하는 스크립트가 있을 것이다.

 

하지만 JAR 파일을 구할 수 없으니 무식하게 복호화 해보기로 하자

[그림.2] 를 자세히 보면 llobapop 가 반복적으로 사용되는 것을 알 수 있다. 난독화된 데이터에서 이런 경우 대부분이 해당 패턴은 사라진다. (물론 여기서는 추측이다.)

 

llobapop 을 모두 제거하면 [그림.3]의 처럼, llobapop 을 공백으로 바꾸어 주면 [그림.3]의 처럼 되는 것을 확인 할 수 있다.

[그림.3] 말질라를 이용한 특정 패턴 제거

 

JAR파일이 없기 때문에 더이상 진도가 나가지 않았다. 하지만 구글링을 통하여 해당 부분의 복호화 정보를 얻을 수 있었다.

힌트는 llobapop 을 제거 후 3자리씩 쪼개진 데이터에서 첫번째 문자만 남기고 제거한다. 그리고 남은 문자들을 거꾸로(reverse) 정렬하면 복화화된 데이터를 얻을 수 있었다

[그림.4] 첫 번째 문자를 추출 후 거꾸로 정렬

 

간단한 스크립트를 이용하여 구현해 보았다. 

 [그림.5] 첫번째 문자만 남기고 거꾸로 정렬하는 스크립트

 

 [그림.6] 스크립트실행시 결과

 

복호화 결과 추가 접근하는 URL 정보를 얻을 수 있었다. (끝...;;)

 

오늘의 미션!!

JAR 파일에 포함되어 있을 복호화 스크립트를 자바스크립트로 구현해 보자

- value 값을 한번에 복호화하는 스크립트

 <script>

function redkit_de(s){
a = s.replace(/llobapop/g," ");    //-- llobapop 를 모두 찾아 " "으로 변환
a = a.split(" ")  //-- a를 배열로 나누기
b = ""; 

for (i=0;i<a.length;i++){b += a[i].substring(0,1);}   // a의 첫번재 문자들을 b 변수에 저장
c = b.split("").reverse().join("");  //-- b의 값을 거꾸로 정렬하여 c 변수에 저장
alert(c); 

}

redkit_de("복호화할 데이터 넣는 부분");  //-- redkit_de 함수 실행

</script>

 

 

* 연습용 샘플

mynllobapopoynllobapopcgbllobapop.ecllobapopyqtllobapoprnnllobapopocellobapo

ptssllobapopsefllobapopiefllobapopt22llobapop.qwllobapopahtllobapoprhwllobapop

ar3llobapopvntllobapopeajllobapopuhtllobapopgljllobapopgbvllobapopnfellobapopae

allobapopwefllobapopkdwllobapop/d2llobapop/3fllobapop:42llobapoppefllobapopt21

llobapopt32llobapophfellobapop

 -> 연습용 샘플을 복호화 할 데이터 부분에 넣으면 동작하는 것을 테스트 할수 있습니다.

    연습용 샘플은 연습할 수 있도록 만든 것으로 악성코드가 아닙니다.
 

 

 

 

설정

트랙백

댓글

자바스크립트 정리 8 (정규표현식)

## 정규표현식

 

1. 정규표현식 (특정한 규칙을 가진 문자열의 집합을 표현하는 데 사용하는 형식 언어)
  1) 형태 ()
    - var test = new RegExp("정규표현식");
    - var test = /정규표현식/; 

 

  2) 정규표현식 검증 메소드

    2-1)  test(); : 검증할 문자열에 포함되었지 검증하여, true 또는 false를 반환  

     ex)

<script>
var kwang = /[0-9]/;     //-- 정규표현식: 숫자가 하나라도 포함되면 true
var vara = kwang.test("ffefafa");   // 검증할 문자열
alert(vara);         //-- 결과값 출력 → 검증할 문자열에 숫자가 없으므로 false 출력
</script>

 

    2-2) exec(); : 검증할 문자열에서 일치하는 문자열을 찾아 반환

 

    2-3) match(/정규표현식/) : 검증할 문자열에서 일치하는 문자열을 찾아 반환

 

    ex)

<script>

//-- exec 예제
var kwang = /\d\s\d\s\d\?/;   //-- 정규표현식
var vara = kwang.exec("1 9 3?43456664efafaefae");   // 검증할 문자열
alert(vara);   //-- 1 9 3? 가 출력됨

 

//-- match 예제
var gue = "kwangguevara.tistory.com";   //-- 검증할 문자열
s = gue.match(/\w\.\w\w/);  //-- 정규표현식
alert(s);   //-- a.ti 가 출력됨

</script>

 

  3) 정규표현식에서 특수 문자 사용

    - 의미가 정해진 기호(+, ^, ?, $ 등)를 일반문자처럼 사용하려면 앞에 \를 써주면 된다

    - /\?/ -- 검증문자열에 ?가 있으면 일치

     물음표(?)는 수량한정자로 \ 없이 /?/로 표기 할 경우 오류가 발생한다.


2. 정규표현식 패턴 정리
 1) /[abc]/ : 검증할 문자열에 대괄호([]) 안의 문자가 하나라도 존재하면 일치 
   - /[1234]/, /[0-9]/, /[a-z]/ ...  [0-9] 은 [0123456789] 와 동일한 표현 

 

 2) /[^abc]/ : 검증할 문자열에 대괄호([]) 안의 문자외의 패턴이 하나라도 존재하면 일치 
   - /[^1234]/, /[^0-9]/, /[^a-z]/ ... [^0-9] 은 숫자외의 문자가 하나라도 있으면 일치

 

 3) /\d/ : 검증할 문자열에 숫자가 존재하면 일치

     /\D/ : 검증할 문자열에 숫자가 존재하면 일치

 

 4) /\w/ : 검증할 문자열에 문자나 숫자가 하나라도 존재하면 일치

     /\W/ : 검증할 문자열에 문자나 숫자이외의 패턴이 하나라도 존재하면 일치

 

 5) /\s/ : 검증할 문자열에 공백, 탭, \n 이 존재하면 일치

   ex)

var kwang = /\d\s\d\s\d/;     //-- 순서에 맞게 패턴이 동일해야 일치
var vara = kwang.test("1 9 3");      //-- [숫자][공백][숫자][공백][숫자] 패턴 
alert(vara);

 

 

설정

트랙백

댓글