Web EK에서 주로 사용하는 자바 난독화 기법

난독화/난독화 강좌 2014. 3. 3. 18:53

Web EK 에서 가장많이 이용되는 취약점은 Java 일 것이다. 악성코드 유포에 이용되는 jar 파일을 분석해보면 자바스크립트 처럼 난독화되어 있다. 하지만 대부분은 자바스트립트 그 것에 비해 단순하게 난독화되어 있다

오늘은 blackhole EK 등에서 Java 취약점 부분에 이용되는 재미있는 난독화 기법을 알아보겠다.

 

아래그림은 2014년 1월 경에 수집한 악성코드 샘플이다. 

상황은 위/변조된 사이트에 접속 후 악성코드 유포 Landing 페이지로 이동되었으며, 악성 Jar 파일을 다운로드한다. 해당 PC는 취약점이 존재하야 이후 악성코드까지 다운로드된 화면이다. 

 (fiddler2를 이용하여 저장해 놓으면 분석시 유용하게 사용할 수 있다)  

[그림 1] 악성코드 유포 샘플

 

분석을 위해 landing 페이지와 jar 파일을 저장한다. fiddler2 - save - response - Response Body .. 로 저장하면 원하는 파일만 쉽게 저장할 수 있다

[그림 2] 악성파일 저장

 

[그림 3]은 lading 페이지의 자바 부분이다. PlugingDectector로 버전 체크 후 asfwe 함수에서 자바의 버전에 따라 applet이 동작한다. JNLP취약점을 이용하기 위한 부분인데 첫 번째 부분으로 난독화 기법을 알아보겟다 (난독화 기법은 모두 동일하다)

[그림 3] Landing Page (java 부분)

 

첫번째 부분만 보면 [그림 4]와 같다. 여기서 파라미터 값 중 ldcrlio 값을 보면 이상한 문자열로 되어있다. 언듯보아서는 해석할 수 없다. 하지만 이부분이 악성파일 다운로드 URL로 변한다.

이부분이 URL로 변화는 과정을 알아보는 것이 이번블로깅에 포인트 이다.   

[그림 4] applet

 

Jar 파일을 Decompiler로 열어보면 상당히 많은 class를 가지고 있다. 첫번째 class는 HTML의 파라미터를 받아오는 역활을하고, 마지막 class는 악성코드를 다운로드/실행 및 레지스트리에 등록하는 역활을 한다. 그리고 나머지 부분은 마지막 난독화된 페이지가 동작할 수 있도록 복호화하는 역활을 하게 된다.

우리의 목적은 ldcrlio 값을 복호화하는 것이므로 해당 부분만 보도록 하겠다. 아래그림에서 2번 부분이 우리가 복호화하고자 부분의 Key 값이 있는 부분이다.

[그림 5] jar 파일

 

위 그림의 3번 부분 중에서 key 값이 있는 부분만 정리해보면 아래의 그림과 같다. 이부분 역시 난독화 되어있으며, ddr_uuidjadisl class에 있는 vb~~dgra 함수를 통하여 복호화된다

[그림 6] Key 값 확인

vb~~dgra 함수는 [그림 7] 처럼 replace메소드를 이용하여 특정 문자열을 지우는 역활을 한다. paramInt = 1 일때 와 paramInt = 2 일때는 모두 복호화 하면 길이가 동일한 두 문자열을 얻을 수 있다.   

[그림 7] Key 값 복호화

 

이문자열들은 [그림 4]의 ldcrlio 값을 URL로 복호화 해주는 Key 이다.

ldcrlio 값은 두 문자열을 이용하여 단일치환암호 방식으로 난독화 된 데이터 인것 이다.

볼라벤툴의 단일치환암호 디코더를 이용하여 복호화해보면 최종 목적지 URL을 확인할 수 있다. ( 암호 문자열은 광게바라 블로그로 변경하였다. )

 

[그림 8] 단일 치환 암호 복호화

 

[그림 9]은 암호화된 문자열이 복호화되는 과정을 설명한 그림이다. (단일치환암호 방식)

 

[그림 9] 단일 치환 암호 복호화 원리

 

이번블로깅의 목적인 ldcrlio 값을 URL로 변경하였다.

끄 읕~ ~~~

이아니라 자바스크립 난독화를 공부하는 블로그이니 자바스크립트를 이용하여 단일치환암호를 풀어보겟다.

 

[그림 9] 는 단일 치환함호를 푸는 자바스크립트 코드다. 생각보다 쉽고 간결하게 만든것 같다.

a 부분에 난독화된 데이터를 넣고 b와 c에 키값 1, 2를 넣으면 문자열로 찍힌다.

[그림 9] 단일 치환 암호 복호화 스크립트 소스

 

* 자바스크립트 소스 

<script>

  a = "AhhjyHH0QE779npfEiE8hcthois8uoaHrx";
  aa = a.split("");
  b = "lxwLGr43qDEvuYp59AcU0ba7ojzithnfQOsC8NXRM6TeISV-_%.&/:#?=dWgmKFHyBk2ZPJ1";

  c = "0123456789abcdefghijklmnopqrstuvwxyz.ABCDEFGHIJKLMNOPQRSTUVWXYZ/:_-?&=%#";
  cc = c.split("");

  for (i=0;i<a.length;i++)
  {
     j = b.indexOf(aa[i]);
     document.write(cc[j]);
  }
</script> 

설정

트랙백

댓글

[신종 툴킷 발견] blackhole EK 3.0 ?? 신종 EK??

난독화/난독화 강좌 2014. 1. 14. 13:32

최근 Blackhole EK와 비슷하지만 다른 툴킷을 탐지하여 분석하고 있다.

상세분석은 볼라벤 분석보고서로 1월 중 배포 예정이다. 오늘은 전반적인 흐름에 대해 알아 보자  

 

큰 틀은 Blackhole EK와 비슷한데 Landing 페이지나 PDF 난독화 등의 부분에서 다르다. 때문에 Blackhole의 변종이거나, 새로운 툴킷 일 가능성이 높다

 * Landing Page: 해외 유명 분석가들이 웹툴킷의 메인 부분을 이렇게 불러서 따라해본다 ^^;;

전반적인 흐름은 [그림 1]과 같다 

 

 [그림 1] 전체 흐름도

 

실제 악성코드 접근 URL은 아래와 같다 (실유포지는 가릴수 뿐이 없다...양해바란다) 

 [그림 2]  접근 URL 상세정보

 

■ Landing Page 분석

Landing Page을 간단하게 살펴보자 (윗쪽은 간단하여 생략하여, 추후 분석보고서를 참조하길 바란다.)

Landing Page의 소스는 [그림 3]과 같다 기존의 블랙홀 툴킷과는 조금 다른 형식으로 되어있다. 하지만 일반적으로 툴킷에서 사용하는 공격코드를 난독화 해놓은 긴 코드와 그것을 풀어주는 복호화 함수 부분으로 구성되어있다.

 

[그림 3] Landing Page

 

기존과 다른점은 복호화 함수부분을 보기 어렵게하기위해 자바스크립트를 더 많이 꼬아 놓았으며, 불필요한 값들을 집어 넣어 기존의 툴킷보다 좀 더 어려워보인다.

 

 

하지만 자세히 보면 결국 key값을 찾을 수 있고, "document.write("<xmp>"+ 키값 + "<xmp>");"를 이용하여 복호화 할 수 있다.

 

복호화를 성공하면 아래 [그림 4]를 확인 할 수 있다.

 

[그림 4] Landing Page 복호화

 

[그림 4]의 복화화된 코드를 보면 ① 부분에서 Plugindetect (자바나 PDF의 버전정보 수집)가 확인할 수 있고 ② 부분에서 PDF와 JAVA취약점 공격 코드를 확인 할 수 있다.

* 기존으 blackhole EK 2.0은 Plugindetect 0.7.6 버전을 사용하였고, Cool EK는  0.8.0을 사용하였는데 해당 EK는 0.8.3을 사용한 것으로 보아 이후 만들어진 것으로 판단된다.

 

 

■ PDF 분석

악성 PDF에 대해 분석해 보자. PDF분석은 툴킷마다 해보아서 익숙했지만, 이번 것은 한번 더 생각해서 풀어야했다. 그만큼 더러웠다? (자바부분은 추후 배포되는 분석보고서를 참고 바란다.)

 

PDF 스트림덤퍼로 분석해 보았다.

각 Object 를 확인해보면 의심스러운 부분이 세 곳 확인된다.

[그림 5] 의심 오브젝트 1

 

[그림 6] 의심 오브젝트 2

 

[그림 7] 의심 오브젝트 3

 

의심 오브젝트1, 2는 난독화된 데이터 코드로 의심스럽지만, 자바스크립트는 아닌 것으로 보아 데이터 형식으로 쓰일 것으로 생각되었다 

 

먼저 오브젝트 3의 자바스크립트를 분석해 보자!

PDF에 삽입된 자바스크립트를 분석하기 위해서는 변수나 일부 양식을 형식에 맞도록 변경해 주거나 정리해 주어야한다.

아래 [그림 8]에서 빨간박스 변수 부분은 자바스크립트에서는 확인되지 않는다 때문에 실행시 오류가 발생한다. PDF 구조를 살펴보면 해당 변수가 [그림 5], 와 [그림 6]을 가리키고 있는 것을 찾을 수 있다. 

 

[그림 8] PDF에 삽입된 자바스크립트

 

보기 어렵게 함수와 이상한 변수로 코딩된 [그림 8]의 자바스크립트를 해석하여 정리하면 [그림 9] 처럼 정리할 수 있다. 

[그림 9] 자바스크립트 난독화 정리

 

정리된 스크립트를 이용하여 난독화된 데이터 부분을 복호화하면 [그림 10]의 자바스크립트를 확인 할 수 있다.

기존의 웹툴킷에서 사용하던 PDF 코드보다 복잡해 보이지만 분석해보면 역시 악성행위를 하는 쉘코드 부분과 오버플로어를 일으키는 부분을 만들어 내는 자바스크립트이다.

빨간 박스부분은 실제 악성행위를하는 쉘코드 부분으로 바쁠때는 해당 부분만 분석하기도 한다.

[그림 10] 자바스크립트 난독화 해제

 

[그림 11]은 쉘코드 부분을 scdbg를 이용하여 간단하게 분석해 본것이다.  

[그림 11] 자바스크립트에 포함된 쉘코드 분석 

 

신종 툴킷으로 보이는 툴킷을 간단하게 분석해 보았다. 간략히 소개하느라 빼먹은 부분이 많다. 자세한 분석내용은 bolaven 분석보고서로 작성되면 참고 바란다.

 

*  게을러서 이제야 글을 올리게 되었지만, 해다 샘플은 지난 9일에 탐지되엇다. 

 

설정

트랙백

댓글

[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

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

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

 

 

 

설정

트랙백

댓글

[9] 스크립트의 동작 흐름으로 풀어보는 난독화

난독화/난독화 강좌 2013. 5. 25. 00:55

[9] 스크립트의 동작 흐름으로 풀어보는 난독화

 

1.     /변조 사이트 확인 중 의심스크립트 확인

[그림.1] 정상사이트에 삽입된 악성 스크립트

 

 

2.     의심스크립트 분리 화면

-    한 줄로 된 의심 스크립트를 분리하여 난독화된 스크립트를 확인

[그림 2] 악성스크립트 분리

 

3.     구조를 알기 쉽게 스크립트 정리

-    스크립트는 메인 함수와 그 안에 포함된 부분함수 2개의 구조로 이루어져 있다

[그림 3] 스크립트 정리 및 구조

 

4.     난독화 패턴 분석

1)   해당 스크립트는 분석하기 어렵게 하기 위해 다수의 쓰레기 값을 추가하였다  

아래의 패턴 등 다양하게 사용되지 않는 변수를 삽입하여 실제 값을 찾기 어렵게 한다

 

var GW;

if(GW!='d'){GW='d'};      GW = d

위의 값들은 스크립트에 전혀 영향을 미치지 않는다

 

2)   부분함수 1은 메인 함수와 부분함수 2의 특정변수를 계산해주는 함수로 사용된다

3)   메인 함수와 부분함수 2에서 HEX값 및 특정 로직의 데이터 값을 삽입하여 악성코드 유포 URL

조합하게 되고 body.appendChild를 이용하여 body에 추가하여 실행하는 구조이다

 

해당 문서에서는 이러한 구조를 모르더라도 alert창을 통하여 흐름을 파악하고 key값을

   유추하여 복호화 하는 방법을 익히는 것이 목표이다

 

 

5.     난독화된 스크립트 복호화 하기

1)   다수의 변수와 함수 등을 이용하여 난독화된 스크립트를 상세히 분석하는 것보다 실행을 위해

변수들이 합쳐지는 부분, 실제 스크립트 값가지고 있는 변수(이하 key)를 찾아 보겠다

 

key값을 찾기 어렵게 함수를 사용하여 난독화되어 한 번에 찾을 수 없었다

 

2)   key값을 찾기 위해 ‘alert’을 이용하여 스크립트 동작 흐름을 알아 보았다

-   주요 부분(함수시작 등)“alert(숫자);”를 삽입  

 

[그림 4] 순서 확인을 위한 alert 삽입

 

3)   실행 시 alert 창의 순서: 1 - 9 - 2 - 4 - 3 - 5 - 6 - 3 - 8

[그림 5] 경고창 순서 확인

 

4)   ‘alert(8)’ 부분에서 스크립트가 종료되었기 때문에 ‘8’ 근처에서 key값이 실행된다고 판단하였다

- 8 부분 근처에서 key값이 될 만한 변수를 찾아보았다

[그림 6] 복호화 key값 확인

 

5)   ‘alert(8)’ 부분에 ‘alert(G)’ 삽입 결과

[그림 7] 복호화된 악성 URL 확인

 

6)    스크립트 동작 순서가 ‘6 - 3 - 8’인데 6번에서 key 값을 찾는 이유! (궁금했다면 Good!!)

- 부분을 실행을 위해 함수가 실행되고 다시 아래 부분이 실행

[그림 8] 스크립트 동작 순서 TIP

 

설정

트랙백

댓글

[8] Dehydrating a String (보이지 않는 코드)

난독화/난독화 강좌 2013. 5. 23. 01:01

[8] Dehydrating a String (보이지 않는 코드)

 

 

1.      Dehydrating a String 이란?

Dehydrating a String은 공격코드를 탭과 스페이스로 난독화하여 소스코드에서 공백으로만 보이도록 작성된 코드입니다. 때문에 보이지 않는 코드 또는 공백코드라고 알려져 있습니다. .

[그림 1] Dehydrating a String (보이지 않는 코드)

1) 2008 Blackhat 보안 컨퍼런스에서 최초 발표 (Hoffman)

2) 201112월에 국내에서 악성코드 유포에 이용 탐지

 

 

2.      Dehydrating a String 코드가 포함된 해킹문제 풀이 (2012 Codegate 문제)

분석에 이용된 샘플은 2012 Codegate 해킹대회에 출제되었던 문제로 tra님이 제공해 주었다.

 

2.1 샘플 구성

- 메인 페이지와 하위폴더에 이미지 및 다수의 구성파일을 가지고 있는 구조로 되어있다.

[그림 2] codegate 문제 구성

 

- 메인 페이지 실행 시 화면

[그림 3] 메인 페이지 화면

 

2.2 소스코드 확인

2.2.1 메인 페이지 소스코드

[그림 4] 메인 페이지 소스코드

1) html 종료 후 비정상적으로 의심스러운 공백스크립트가 삽입된 것을 확인 할 수 있다.

 

2.2.2 codegate.js 소스 코드

 

[그림 5] codegate.js 소스코드

1) 메인 페이지에서 codegate.js를 불러오는 것이 확인된다.

2) codegate.js 소스 확인 시 의심스러운 스크립트를 확인 할 수 있다.

 

[그림 6] 의심스크립트 디코딩

1) 의심스러운 스크립트만 분리하여 eval alert으로 수정 후 실행하면 임의코드1이 확인된다

 

[그림 7] 임의코드1 malzilla를 이용하여 보기좋게 정리

1)     임의코드1malzilla의 기능을 이용하여 정리해보면 함수의 형태를 가지고 있고, parseInt

     String.fromCharCode로 보아 난독화 데이터를 복호화하는 역할이라고 추측할 수 있다.

2)     [그림 7]처럼 eval alert으로 변환하여 실행해보면, 결과값이 나타나지 않는다. 복호화되는

     데이터 부분이 없기 때문이다.

3)     다른 어딘가에 디코딩된 데이터가 있을 것이라고 판단되어, 관련 소스코드를 모두 확인결과

     [그림 4]의 메인 페이지에 삽입된 공백스크립트가 가장 의심스러웠다

 

2.2.3 메인페이지 공백스크립트 + 임의코드1 분석

[그림 8] 임의코드1과 메인 페이지의 공백스크립트 결합

1)     임의코드1은 함수이고 공백스크립트는 함수를 실행하는 형태이므로, [그림 8]처럼 입력한다.

2)     eval alert으로 수정 후 값을 확인 해보았다.

 

[그림 9] 공백스크립트 복호화 결과

1)     임의코드1에 의해 공백코드가 임의코드2로 복호화되는 것을 확인 할 수 있었다

 

[그림 10] 임의코드2에서 인증키 값 확인

1)     임의코드2에는 인증키 값을 표시하는 듯한 authkey 값을 확인 할 수 있었다.

2)     [그림 10]처럼 alert을 이용하여 인증키 값을 확인해보자

 

[그림 11] 인증키 값 확인

 

 

3.      Dehydrating a String 부분 상세 분석

“Dehydrating a String 분석1”에서 공백코드 부분을 상세분석 해보자.

 

3.1 임의코드1 정리

[그림 12] 임의코드1 상세분석

1)     임의코드1 malzilla Format code기능으로 처럼 정리 후 어렵게 표시된 변수를 보기 쉽게

       바꾸어 주면 과 같은 함수가 된다.

 

 

3.2 공백스크립트 분석

[그림 13] 공백의 hex값 확인

1)     메인페이지의 공백스크립트의 공백 부분을 malzilla HEX값을 확인하면 09 20으로 이루어

진 것을 확인할 수 있다. (HEX값에서 09 = TAB, 20 = 스페이스바)

2)     TAB과 스페이스로 이루어져 있기 때문에 마치 아무것도 없는 것 처럼 보였던 것 이다. 

 

[그림 14] 스페이스바=1, TAB=0으로 변환

1)    스페이스바=1, TAB=0으로 변환하여 보면 01로 이루어진 것을 확인 할 수 있다.

2)     임의코드1 함수에서는 공백코드를 2진수로 변환 후 다시 문자열로 변환한다

 

3.3 공백스크립트 상세분석

공백부분을 복호화하는 함수부분을 자세히 알아보고 연습해 보자!

  분석에 사용된 공백코드는 너무 길어, 실습은 수정한 공백코드를 사용하겠습니다.

<script>

function c(s)

{

   s=s.replace(/ /g,1);           //-- 공백(스페이스바) 1로 변환

   s=s.replace(/\t/g,0);         //-- TAB 0으로 변경 ('\t' = TAB)

   var bb=s;             

   s="";

   for(i=0;i<bb.length;i++)

   {

     s=bb.substring(i,i+1)+s    //-- 순서를 거꾸로 변경 (reverse와 동일한 효과)

   };

   var cc="";

   for(i=0;i<s.length;i+=9)

   {

     cc+=String.fromCharCode(parseInt(s.substring(i,i+9),2)) 

//-- 8개자씩 끈어서 2진수를 10진수변환 후 다시 문자열로 변환하여 cc에 저장

   };

   eval(cc);                   //-- cc를 실행

}

 

c("                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    ");  //-- 함수실행 부분 (s에 공백코드 삽입)

</script>

 

1)    스페이스바와 TAB 1 0으로 변환한다.

2)    substring을 사용하여 순서가 반대로 변환되도록 한다.

3)     8자리씩 잘라 2진수의 형태를 갖추게 하고, parseInt를 이용하여 10진수로 만든다.

4)     String.fromCharCode를 이용하여 문자열로 변환하여 cc 변수에 저장하고 eval로 실행한다.

 

 

설정

트랙백

댓글

[7] 자바스크립트의 함수 이해하기

난독화/난독화 강좌 2013. 5. 19. 03:58

[7] 자바스크립트 함수 이해하기

 

1.      자바스크립트 함수

 

자바스크립트에서 함수는 난독화에서도 다양하게 이용되기 때문에 잘 이해해 두어야 한다.

자바스크립트에서 함수도 수학에 함수와 동일하다. X라는 입력 값을 넣었을 때 Z라는 출력 값이

나오도록 해주는 것을 말한다

아래의 그림을 참고하여 자바스크립트에서 함수를 표현 방법을 알아보자

[그림 1] 자바스크립트 함수

 

1)    그림에서 은 함수의 이름을 선언해 주는 것이다. 함수를 실행시킬 때 함수의 이름을 사용한다.

2)    는 연산해주는 부분이다. 실제 동작 하게하는 스크립트가 들어가는 부분이다.

3)    은 계산된 결과 값을 을 리턴 해주는 부분이다. ( x에 값이 들어오면 12를 더해 b를 리턴)

4)    는 함수를 실행하는 부분으로, 7을 넣어 kwang( )로 정의된 함수를 실행시키라는 뜻이다.

5)    함수를 실행 후 b의 값을 출력해 보면 b=19라는 결과를 얻을 수 있다.

 

 

 

2.      예제를 통하여 함수 사용법 익히기

 

아래 예제를 통하여 연습하면서 함수와 친해져 보자!

 

2.1 기본구조 연습

<script>

function kwang()                       //-- 함수이름

 {

   a="kwangguevara"+".tistory.com";    //-- 스크립트

   return a;                           //-- 출력 값 (스크립트 후 결과값)

 };

// alert(a) 이 부분에서 a값을 alert해보면 정의되지 않아 오류 발생

kwang();                              //-- 함수 실행

alert(a);                               //-- 함수가 실행 후 a 값 확인 

</script>

 

        1)    Kwang()가 실행되면 되면 a=”kwangguevara.tistory.com”가 되는 함수이다.

        2)    함수 실행 전에는 a가 정의되지 않았지만, 실행 후에는 출력이 되는 것을 알 수 있다

 

2.2 함수 속 함수 구조

<script>

function kwang()                //-- 첫 번째 함수

 {

   var a='kwang'+'guevara';

   return a;

 };

 

function sam()                 //-- 두 번째 함수

 {

   b=kwang()                 // 첫 번째 함수의 return 값을 b에 저장

   var c=b+"moc.yrotsit.".split("").reverse().join("");

   return alert(c);              // 두 번째 함수의 출력 값 (alert을 이용하여 출력)

 };

sam();                        // 두 번째 함수 실행

</script>

 

        1)    Sam()함수 실행 시 kwang()함수가 실행되고 값이 b에 저장되어 변수 c를 구하는데 사용된다.

        2)    위의 경우처럼 난독화에서도 함수를 미리 정의해 놓고 다른 함수에서 불러 쓰는 경우가 많다

 

2.3 난독화에서 함수 사용 예

 

- 아래와 같은 한 줄로 된 자바스크립트가 포함되어 있다. 동작원리를 알아보자

 

<script>function _(x,xx){var a=(x+xx).split("").reverse().join("");return a;};var t = open;function sam(s){I=_("moc.yrots","it.araveuggnawk");var c="http://"+I;s(c);};sam(t); </script>

 

- Malzilla Decoder 탭에 있는 [format code] 기능을 이용하여 보기 좋게 정리하자.

 

<script>

 function _(x,xx)                       //ß 함수

 {

   var a=(x+xx).split("").reverse().join(""); //-- x변수와 xx변수를 더해서 거꾸로

   return a;

 };

 var t = open;                        //-- t 변수 정의

 function sam(s)                      //ß 함수

 {

   I=_("moc.yrots","it.araveuggnawk");  //-- 함수를 실행하여 I 변수에 저장

   var c="http://"+I;

   s(c);                              //-- sam(s) 함수의 출력값

 };

 sam(t);                              //-- sam()함수의 s부분에 t변수를 넣어 실행

 </script>

 

        1)    스크립트를 실행하면 웹 브라우저가 실행되어 “http://kwangguevara.tistory.com/”으로 접속한다

        2)    I=_("moc.yrots","it.araveuggnawk"); function _(x,xx)를 실행하여 I에 저장한다.

ð  x 변수에 ”moc.yrots"xx변수"it.araveuggnawk" 값을 넣은 _(x,xx) 형태인 것을 알 수 있다

        3)    실제 악성스크립트에서는 함수 명을 애매하게 만들어 알아보기 어렵게 하는 경우가 많다 

설정

트랙백

댓글

[6] 난독화에 자주 등장하는 자바스크립트 함수 1

난독화/난독화 강좌 2013. 5. 17. 02:47

[6] 난독화에 자주 등장하는 스크립트 함수 1

 

1.      String.fromCharCode

String.fromCharCode는 아스키코드를 기준으로 숫자를 문자로 변환해주는 함수이다.

아래의 예제를 통하여 실습해 보면 쉽게 이해할 수 있을 것이다.

<script>

// -- 기본 사용 예제 1

document.write(String.fromCharCode(65));  // -- 출력 1

document.write("<br>");document.write("<br>");  // -- 단지 결과값의 줄 바꾸기 역할만!!

 

// -- 기본 사용 예제 2

s=65

document.write( String.fromCharCode(s));  // -- 출력 2

document.write("<br>");document.write("<br>");  // -- 줄 바꾸기

 

// -- 문자열로 변환하는 예제

a="104,116,116,112,58,47,47,107,119,97,110,103,103,117,101,118,97,114,97,46,116,105,115,116,111,

114,121,46,99,111,109";

b=a.split(",");  // -- a를 배열로 만드는 부분

c="";

for (i=0;i<b.length;i++)  // -- i=0 부터 b의 길이 보다 작을 때 까지 1씩 증가

  {

   c+=String.fromCharCode(b[i]);  // -- 배열 b i번재 요소를 문자화해서 c 변수에 저장

  }

document.write(c);  // -- 출력 3

 

</script>

 

## 예제 스크립트 결과  

ð  A    (출력 1)

ð  A    (출력 2)

ð  http://kwangguevara.tistory.com   (출력 3)

 

String.fromCharCode는 난독화된 데이터 복호화시 key 값을 문자열로 변환하여 저장하기 위해 많이 사용합니다. 때문에 key값이 저장된 변수를 찾는데 도움이 됩니다.

 

2.      charCodeAt

String.fromCharCode의 반대라고 생각하면 된다. 문자를 숫자로 변환해주는 함수이다

 기본형태: 변수(문자열).charCodeAt(자리수);  -- 변수(문자열)(자리수)를 숫자로 변환

 

 역시 아래의 예제를 통하여 실습해 봅시다!!

<script>

// -- 기본 사용 예제 1

a="A";

document.write(a.charCodeAt(0));    // -- 출력 1

document.write("<br>");document.write("<br>");   // -- 줄 바꾸기

 

// -- 기본 사용 예제 2

b="ABC";

document.write(b.charCodeAt(0) + ", " +b.charCodeAt(1) + ", " + b.charCodeAt(2));  // -- 출력 2

document.write("<br>");document.write("<br>");  // -- 줄 바꾸기

 

 

// -- 문자열을 변환하는 예제

c="http://kwangguevara.tistory.com";

s="";

for (i=0;i<c.length;i++ )

{

 s+=c.charCodeAt(i)+", ";

}

document.write(s);    // -- 출력 3

</script>

 

## 예제 스크립트 결과  

ð  65          (출력 1)

ð  65, 66, 67   (출력 2)

ð  104, 116, 116, 112, 58, 47, 47, 107, 119, 97, 110, 103, 103, 117, 101, 118, 97, 114, 97, 46, 116, 105, 115, 116, 111, 114, 121, 46, 99, 111, 109,       (출력 3)

 

 

3.      parseInt

String 인자 값에서 정수로 표현 가능한 부분을 10진수로 변환하여 나타내어 주는 함수이다.  

기본형태: parseInt(string, 진수);  --  string 진수를 10진수로 변환

* 진수 부분에는 2 ~ 36의 숫자만 들어갈 수 있다.

* 진수부분을 생략했을 때 string 부분이 0으로 시작하면 8진수로, \x로 시작하면 16진수로

처리된다.

 

<script>

//parseInt(string, 진수) <---스트링(진수) 10진수로 변환

a=parseInt(1010,2);

document.write(a + "<br>");    // -- 출력 1

a=parseInt(1010,8);

document.write(a + "<br>");    // -- 출력 2

a=parseInt(1010,16);

document.write(a + "<br>");   // -- 출력 3

a=parseInt(1010,36);

document.write(a + "<br>");   // -- 출력 4

 

// parseInt를 이용하여 Hex값을 10진수로 변환하기

b="68,74,74,70,3a,2f,2f,6b,77,61,6e,67,67,75,65,76,61,72,61,2e,74,69,73,74,6f,72,79,2e,63,6f,6d";

b=b.split(",");

c="";

for (i=0;i<b.length;i++)

{

  c+=parseInt(b[i],16)+", ";

}

document.write(c);       // -- 출력 5

</script>

 

## 예제 스크립트 결과  

 

ð  10        (출력 1)

ð  520       (출력 2)

ð  4112      (출력 3)

ð  46692     (출력 4)

ð  104, 116, 116, 112, 58, 47, 47, 107, 119, 97, 110, 103, 103, 117, 101, 118, 97, 114, 97, 46, 116, 105, 115, 116, 111, 114, 121, 46, 99, 111, 109,     (출력 5)

 

4.      Hex값을 문자열로 변환하기

String.fromCharCode parseInt를 이용하여 hex값을 문자열로 변환하는 예제이다.

실제 악성스크립트에서 상당히 많이 사용되고 있으므로 확실히 익혀두기 바란다.

 

<script>

// 응용하기 (16진수를 문자열로 변환하기)

b="68,74,74,70,3a,2f,2f,6b,77,61,6e,67,67,75,65,76,61,72,61,2e,74,69,73,74,6f,72,79,2e,63,6f,6d";

b=b.split(",");

c="";

for (i=0;i<b.length;i++)

{

  c+=String.fromCharCode(parseInt(b[i],16));   // -- 16진수를 10진수로 변환 후 문자열로 변환

}

document.write(c);     // -- 출력 1

</script>

 

## 예제 스크립트 결과  

ð  http://kwangguevara.tistory.com

설정

트랙백

댓글

[5] 블랙홀 툴킷의 PDF 난독화 풀이

난독화/난독화 강좌 2013. 5. 13. 02:49

[5] 블랙홀 툴킷의 PDF 난독화 풀이

 

1.      Blackhole Exploit Toolkit 이란?

 

악성코드 유포에 이용되는 Web exploit Toolkit 중에서도 가장 많이 알려져 있고, 악성코드 유포에

이용되는 빈도수도 꾸준히 상위권을 유지하고 있다. 현재는 2.0버전이 이용되고 있으며, pdf, java 등 다양한 취약점을 이용한다.

 

 

2.      Blackhole Toolkit의 난독화

 

블랙홀 툴킷을 분석하면 다양한 난독화 기법이 이용되는 것을 볼 수 있다. 그 중 에서도 메인페이지 부분과 pdf파일에 삽입된 자바스크립트 난독화 부분이 있는데, 특히 pdf 부분은 시간이 지날수록 조금씩 어렵게 바뀌고 있다.

 

3.      PDF 파일에 삽입된 자바스크립트 난독화 분석.

 

2013 5 10일 확인된 blackhole toolkit의 샘플 중 pdf 난독화 부분을 확인해 보겠다.

 

3.1 분석을 위해 수집한 패킷 샘플에서 PDF 파일 추출

[그림 1] 샘플패킷에서 PDF파일 추출

 

 

3.2 악성 PDF 파일에서 자바스크립트 추출

[그림 2] PDF파일에서 자바스크립트 분리하기

1)    그림에서 Load 버튼을 클릭하여 저장한 PDF파일을 불러온다

2)    그림에서 부분에 표시된 Objects을 클릭하면 부분에 내용이 표시된다.

3)    Objects를 하나씩 클릭하여 의심스러운 내용이 포함된 것을 찾는다

4)    아래그림 처럼 분리된 자바스크립트를 확인할 수 있다

 

[그림 3] 분리된 자바스크립트

 

3.3 악성 스크립트 분석

 

3.3.1 스크립트 구조

[그림 4] 악성 스크립트의 구조

 

1)    난독화된 데이터 부분 a ZA( )함수들로 이루어져 있는 배열이다.

 

2)    이것은 첫 번째 스크립트 부분의 마지막 줄에 있는 function ZA(a)에 의해 아스키코드로

   변환된다.

 

3)    아스키코드로 변환된 것은 다시 두 번째 스크립트 부분에 의해 문자열로 변환되어 실행된다.

 

3.3.2 첫 번째 스크립트 부분 분석

 

if((this.getSaveItem+"")[0]=="f")if(ImageField1.ZZA(321,513613,"a")===0) {z=this;zz="y";x='eI';}

// if조건이 만족할 때 {z=this;zz="y";x='eI';}인데, 여기서는 스크립트만 가져왔기 때문에 조건이

 성립하지 않아 스크립트가 동작하지 않는다. 실행되도록 하기 위해 if 절을 주석 처리하겠다

 

dd="Code";  

ddd="ar";

s="ntvtdhfePJxTmlNo#hFpx!ZeA*yvv#@yiODshOxsTLbKSJljyjNibt3tb23t";

xx=s[2]+'al';

// 위의 4줄은 메인 부분을 보기 어렵게 하기 위해 쪼개놓은 코드라고 생각하면 된다.

   메인 부분을 이 부분들을 보고 수정하면 원래 복호화 코드가 된다

 

function ZZA(){return 0;}   //  if 절을 만족시키기 위해 사용하는 코드

 

function ZA(a){return z["\x65"+xx]("\x70ar"+"s"+x+s[0]+s[1])(a,26);}

// 메인 부분 1, 이 부분을 위의 내용들을 참고하여 수정하면 아래처럼 된다

ð  function ZA(a){return this.eval(parseInt(a,26);}

 

 

3.3.3 두 번째 스크립트 부분 분석

 

if((z.getSaveItem+"")[0]=="f")if(zz=="y")if(020===0x10)

// 첫 번째 부분과 동일한 이유로 if절은 주석 처리한다

 

z["\x65"+xx](String["fromCh"["conca"+s[3]](ddd,dd)]["appl"["conca"+s[3]](zz)](String,a));

//메인 부분 2, 이 부분도 위의 내용들을 참고하여 수정하면 아래처럼 된다

 

ð  this.eval(String.fromCharCode.apply(String,a));

 

 

3.3.4 복호화 데이터 출력

  - 스크립트 분석한 것을 적용하면 아래와 같다

 

[그림 5] 간결화한 스크립트

1)    문자열로 확인하기 위해 스크립트가 실행되는 두 번째 eval alert으로 변경 후 실행한다

 

- alert으로 수정하여 실행하면 아래처럼 복호화된 데이터를 확인할 수 있다

[그림 6] 복호화 결과

1)    결과를 확인하면 Shallcode가 포함된 스크립트를 확인 할 수 있다

 

 

3.4 shallcode 추출 및 악성코드 유포 URL 확인

- 복호화 결과에서 우리가 필요한 shallcode 부분만 document.write를 이용하여 추출한다

 

 

[그림 6] 스크립트에서 Shallcode 부분 추출

1)     실제로 동작하는 Shallcode 부분만 추출하기 위해 나머지 부분은 주석처리 후 Shallcode

    저장되는 변수를 확인한다

 

- Malzilla Tool을 이용하여 최종 악성코드 유포지 확인

[그림 7] Mallzilla를 이용한 악성코드 유포지 확인

 

1)    Shallcode를 분석하기 위해서는 일반적으로 해당부분을 파일로 만들어 ollydbg에서 분석한다.

     하지만 여기서는 간단하게 malzilla를 이용하는 방법을 알아보았다.

 

2)    일반적으로 Shallcode malzilla로 확인 시 Xor 연산이 되어 바로 보이지 않는 경우가 많지만,

      해당 샘플에서는 악성코드 유포지가 바로 확인되었다

 

 

 

 

[참고] Shallcode를 실행파일로 만들어주는 사이트: http://sandsprite.com/shellcode_2_exe.php

 

설정

트랙백

댓글

[4] 난독화 연습 문제풀이 따라하기 I

난독화/난독화 강좌 2013. 5. 8. 23:52

[4] 난독화 연습 문제풀이 따라하기 I

 

1.      기본적인 난독화 풀이 방법을 통한 풀이

    해당 난독화 기법은 2012년도에 실제 악성코드 유포에 이용되었던 것으로, 설명에 이용하기 위해

   악성URL 대신 블로그 주소를 넣어 샘플을 만들어 실습하였습니다.

 

1.1 /변조된 사이트에서 악성 자바스크립트 확인

- 정상사이트지만 html 종료 후 비정상적으로 삽입된 의심 스크립트 확인

[그림 1] 의심스크립트 확인

 

1.2 의심스크립트만 분리 후 실행화면

- 의심스크립트 실행 시 특정 URL로 접속을 시도한다

실제 악성스크립트에서는 width=0, height=0으로 설정된 iframe이 삽입되어 아래처럼 연결화면이

나오지는 않았지만, 이해하기 쉽게 하기위해 특정 URL로 연결동작이 보이도록 변경하였다.

[그림 2] 스크립트 실행 시 특정URL 접속 확인

 

1.3 의심스크립트 분석

  - alert을 이용한 문자열 확인

 

[그림 3] 의심스크립트 정리 

    의심 스크립트만 분리하여 저장 후 보기 좋게 나눈다

    A 부분이 document.write unescape를 통하여 어떤 동작하는 것으로 의심되기 때문에

    document.write alert으로 변경하여 문자열로 확인시도 한다

 

- 실행 결과

[그림 4] A부분 결과 값

 

- A부분 결과 값를 [그림3] A부분에 삽입

[그림 5] A부분결과 값 삽입

 

- 결과 부분을 보기 좋게 정리

[그림 6] 스크립트 정리

    function 부분을 보기좋게 정리하면 document.write 부분이 의심스러워 보인다

    document.write alert으로 변경하여 결과값을 문자열로 확인시도 한다

 

- 실행 결과

 

[그림 7] 최종 결과 값 확인

 

1.4 의심스크립트 분석 결과

- 의심스크립트 분석결과, 특정사이트로 연결하는 iframe이 난독화된 스크립트로 확인

- 실제 악성코드에서는 width=0, height=0으로 설정되어 사용자가 인지하지 못한 상태에서

  악성 URL로 연결을 시도 후 악성파일을 다운로드

 

강좌4_샘플.zip

 

 * 해당 글에서 분석한 난독화 샘플이 필요하시면 댓글 달아 주시면 보내드리겠습니다.

 → 파일 첨부하였습니다. (받아가시고 댓글 부탁드려요 ^^)

설정

트랙백

댓글