no image
[Malware] MadAngel 악성코드 분석
1. 개요악성코드는 여러 분류로 나누어 볼 수가 있다. 이 중 일반 사용자의 입장에서 ‘악성코드’ 라는 단어보다 친숙한 ‘바이러스’ 가 있다. 사실 필자도 보안을 공부하기 이전에는 ‘악성코드’ 라는 단어는 아예 들어보지 못했고, 대신 ‘바이러스’ 라는 단어로 모든 악성코드를 지칭했었다. 바이러스는 악성코드 분류의 한 종류로 ‘스스로를 복제하여 악의적 목적을 수행하는 악성 소프트웨어(Wiki)’ 라는 의미를 가지고 있다. 컴퓨터 바이러스가 아닌 우리가 알고 있는 메르스(MERS)나 감기와 유사하다. 바이러스에 감염된 사람으로부터 다른 사람도 감염시키듯이, 컴퓨터 바이러스는 감염된 파일을 실행시키면 다른 파일을 감염시킨다.컴퓨터 바이러스는 동작 방식에 따라 차이가 있겠지만, 일반적으로 악의적인 코드를 파일에..
2016.09.20
no image
악성코드 분류
1. 악성코드란악성코드란 악성 행위를 위해 개발된 컴퓨터 상에서 동작하는 모든 실행 가능한 형태이다. 이는 사용자의 의사와 이익에 반해 시스템을 파괴하거나 정보를 유출하는 등 악의적인 활동을 수행하도록 의도적으로 제작된 소프트웨어를 말한다. 보통 악성코드라 하면 EXE 파일이 떠오르지만, 이외에도 JS와 같은 스크립트나, 개발자의 실수로 만들어진 버그 또한 악성코드라 분류할 수 있다. 악의적으로 사용된다는 뜻의 악성코드는 어디에 사용될까? 이에 대한 답은 다양하다. 악성코드의 대상은 사회 기반 시설에서부터 산업 기밀을 목적으로 기업을 대상으로 할 수 있다. 이처럼 특정한 목표를 갖는 것 외에도 일방적으로 많은 이들에게 감염시키고자 하는 예도 있다. 랜섬웨어나 DDoS에 사용될 악성코드의 경우 많은 사용자..
2016.03.03
Viruses Revealed _ David Harley
Virus 감염(Infect)이란 바이러스가 명령들의 연결 사이에 자신을 집어넣어서 정당한 프로그램의 실행뿐만 아니라 바이러스의 실행을 유발하도록 하는 것이다.바이러스의 구조는 세가지 원형을 고려한다. 즉 주요 구성작용을 세가지로 나누어 볼수 있다. 첫째로 감염작용은 바이러스가 퍼지는 방식이나 경로들로 정의, 둘째로 피해작용은 바이러스가 복제 외에 무엇을 하느냐로 정의된다. 셋쨰로 트리거작용은 피해를 일으킬 시기를 결정하는 절차로 정의된다.피해로는 트래싱이나 부팅불가, 메모리 점유, 디스크 공간 차지, 클럭 싸이클 소모, 시스템 변경 혹은 이들의 조합으로 나타난다.스텔스 작용으로 은폐 기법을 사용하는 바이러스들은 종종 스텔스 바이러스라고 기술된다. 다형성(Polymorphism)은 자신의 생김새를 변화시..
2015.03.04
MadAngel_분석보고서.pdf


1. 개요

악성코드는 여러 분류로 나누어 볼 수가 있다. 이 중 일반 사용자의 입장에서 악성코드라는 단어보다 친숙한 바이러스가 있다. 사실 필자도 보안을 공부하기 이전에는 악성코드라는 단어는 아예 들어보지 못했고, 대신 바이러스라는 단어로 모든 악성코드를 지칭했었다바이러스는 악성코드 분류의 한 종류로 스스로를 복제하여 악의적 목적을 수행하는 악성 소프트웨어(Wiki)’ 라는 의미를 가지고 있다. 컴퓨터 바이러스가 아닌 우리가 알고 있는 메르스(MERS)나 감기와 유사하다. 바이러스에 감염된 사람으로부터 다른 사람도 감염시키듯이, 컴퓨터 바이러스는 감염된 파일을 실행시키면 다른 파일을 감염시킨다.

컴퓨터 바이러스는 동작 방식에 따라 차이가 있겠지만, 일반적으로 악의적인 코드를 파일에 삽입하여 공격자가 지정한 악의적인 행동을 수행한 다음에서야 원래의 정상적인 동작을 수행하도록 한다. 그렇기에 일반 사용자의 입장에선 모든 파일이 잘 실행되기 때문에 모를 수도 있다. 하지만 이미 바이러스가 실행된 사용자 PC 는 대부분 속도가 현저히 저하 되거나, CPU 사용량이 크게 증가하는 등으로 사용자의 PC 사용을 방해한다이번에 분석하고자 하는 컴퓨터 바이러스는 ‘Mad Angel’ 로 해당 악성코드의 동작 방식과 감염 방식 등에 대하여 알아보자.


2. 분석 정보

해당 악성코드에 대한 정보는 아래와 같다. 분석 중 필자가 가진 샘플이 감염된 파일인 것을 알 수가 있었다. 대신 드롭되는 Serverx.exe 가 감염된 파일에 삽입된 부분의 코드와 유사한 코드라는 점과, 감염된 파일이 다른 파일을 감염시키는 동작을 수행하는 중 해당 프로세스를 강제로 종료하면 Serverx.exe 가 실행되어 감염을 재개하는 점으로 미루어보아 실질적으로 숙주와 같다는 것을 알 수 있었다.

아래 그림과 같이 sample.exe 를 실행시켰을 때 두 개의 ‘sample.exe’ 프로세스가 존재하고 있는 것을 확인할 수 있다. 이 중 부모 프로세스(PID:2540)가 악성 동작(파일 감염)을 수행하는 것이며, 자식 프로세스(PID:2548)는 감염된 파일의 원래 동작을 수행하는 것이다. 감염된 파일인 sample.exe 를 실행할 경우 바이러스에 의해 삽입된 악성 동작을 수행하는 부분에서 루프를 돌게 된다. 그러므로 MadAngel 은 파일이 원래의 동작을 수행하는 자식 프로세스를 생성한다.

감염 행위를 하고 있는 sample.exe 프로세스를 강제로 종료 시키면 아래 그림과 같이 Severx.exe 가 생성되는 것을 확인할 수 있다. 하지만 여기서 의문을 가져야할 점은 바로 “ctfmon.exe” 프로세스의 자식 프로세스로 생성되었다는 점이다.

ctfmon.exe 는 해당 샘플을 실행하기 이전부터 존재하고 있던 정상적인 프로세스이다. 그렇다면 어떻게 ctfmon.exe Serverx.exe 를 자식 프로세스로 가질 수 있을까? 이는 sample.exe 가 동작하면서 임의의 프로세스에 Code Injection 을 하기 때문이다. Injection 되는 코드는 감염 행위를 하고 있는 프로세스가 종료되면, Serverx.exe 를 다시 실행시킨다. 결국 Serverx.exe 프로세스를 종료 시켜도 다시 Serverx.exe 가 실행된다.

감염된 샘플과 Serverx.exe Serverx.exe 를 자동실행 레지스트리에 등록하여 PC 를 재부팅하여도 다시 감염을 실행하도록 한다.

 

3. 상세 분석

MadAngel 을 실행할 경우 아래와 같이 뮤텍스를 통해 이미 MadAngel 이 동작 중인지 확인한다. 뮤텍스의 이름이 “Angry Angel v3.0” 인 것을 알 수 있으며, 동작 중이라면 감염 동작을 수행하지 않고 파일 원래의 기능이 동작하도록 한다. 

만약 동작 중이지 않다면, 실행된 MadAngel WinExec API 를 통해 정상 동작을 수행하는 자기 자신을 실행한다. 실행된 또 다른 자기자신은 위와 마찬가지로 뮤텍스를 확인하고, 뮤텍스가 이미 존재하기 때문에 정상 동작을 수행하는 루틴으로 가게 된다.

악성코드는 System32 폴더에 Serverx.exe 라는 파일을 드롭한다. Serverx.exe MadAngel 의 핵심 코드가 들어있는 실행 파일로, 실질적으로 Serverx.exe 가 감염될 코드와 같다. 드롭 후 Serverx.exe 를 자동 실행 레지스트리에 등록하여 PC 가 종료되더라도 다시 부팅될 때 감염 동작을 수행하도록 한다.

아래와 같이 새로운 스레드를 생성한다. 생성된 스레드는 RegNotifyChangeKeyValue API 를 통해 위에서 등록한 레지스트리의 값이 삭제될때까지 기다린다. 만약 해당 값에 변화가 생기면 다시 레지스트리에 등록한다.

자신에게 스레드를 생성한 뒤 FindWindow 를 통해 임의의 윈도우를 탐색하고 해당 윈도우에 대한 프로세스 ID 를 가져온다. 그리고 OpenProcess API 를 통해 해당 프로세스의 핸들을 얻는다.

얻어온 프로세스 핸들에 대해 VirtualAllocEx 를 통해 메모리 공간을 할당해준다. 할당한 메모리 공간에 새로운 데이터를 기록을 해주는 것을 확인할 수 있다. 메모리에 데이터를 기록한 후 현재 프로세스의 ID 를 가져온다. 이는 현재 프로세스 ID CreateRemoteThread 를 통해 생성할 스레드의 인자로, 넘겨받은 프로세스 ID 가 종료되는지 확인하기 위함이다. CreateRemoteThread 를 통해 데이터를 기록한 메모리 공간을 실행하는 스레드를 생성해준다.

위의 동작을 수행한 뒤 파일 감염을 시작한다. 우선 FindFirstFile FindNextFile API 를 통해 각 폴더를 탐색한다. 그리고 폴더에 있는 파일의 이름에서 끝의 네 글자가 아래와 같이 “.exe” “.scr” 인지 확인한다. 이 두 확장자가 아닐 경우 감염시키지 않는다.

감염에 사용된 코드를 디컴파일 하면 아래와 같은 결과를 얻을 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
FileInfection()
{
    data = f.read(0x1000);
    pDos = &data;
    pNt = pDos + pDos.lfanew;    //pDos + 0x3c
    pSec = pNt + 0xf8;
    NumberofSection = pNt+6;
 
    for(int i=0; i<NumberofSection; i++)
        pSec += 0x28;     // Find a Last Section
    if(pNt.AddressofEntrypoint > pSec.RVA)
    {
        tmp = pNt.AddressofEntrypoint - pSec.RVA + pSec.PointertoRawData;
        SetFilePointer(hFile, tmp, FILE_BEGIN);
        ReadFile(hFile, Buffer:data-4, size:4);
    }
    pSec.Characteristics = pSec.Characteristics | 0xe0000000;
    
    FileEndPoint = SetFilePointer(hFile, 0, FILE_END);
    if(FileEndPoint == -1){ return; }
    
    pSec.SizeofRawData = FileEndPoint + 0x118f - pSec.PointertoRawData;
    if(pSec.SizeofRawData > pSec.VirtualSize)
    {
        dwOrigVirtualSize = pSec.VirtualSize;
        pSec.VirtualSize = pSec.SizeofRawData;
 
        calc = (pNt.SectionAlignment - 1);
    /* 이 크기만큼 SizeofImage 에 더함 */    
        pNt.SizeofImage += ((pSec.VirtualSize + calc) & NOT(calc)) - ((dwOrigVirtualSize + calc) & NOT(calc));
    }
 
    Orig.AddressofEntrypoint = pNt.AddressofEntrypoint;
    pNt.AddressofEntrypoint = pSec.RVA + FileEndPoint - pSec.PointertoRawData;
 
    MalCode[0x1B= Orig.AddressofEntrypoint + pNt.Imagebase;    /* Write a OEP */
    WriteFile(hFile, MalCode, size:0x118F);    /* Write a MalData to FileEndPoint */
    SetFilePointer(hFile, 0, FILE_BEGIN);
    WriteFIle(hFile, pDos, size:0x1000);    /* Write a new pe header */
}
cs

위와 같은 방식으로 파일이 감염되면 아래와 같은 구조를 띄게 된다. 기존의 AddressofEntrypointImageBase를 더한 값(EP) 가 덧붙여지는 악성 코드의 0x1b 지점에 기록되어, 감염 되기 이전의 AddressofEntrypoint 를 알 수 있다.

다음 표는 임의의 샘플의 감염 전 후 PE 구조 차이다.


4. 진단 및 치료

해당 샘플의 경우 다형성을 띄고 있지 않다. 그렇기에 진단이나 치료에 있어 상대적으로 어렵지 않다. 아래 바이너리는 감염된 두 파일에 덧붙여진 코드를 나타낸다. 코드에 있어 다른 부분은 0x1B 부터 4 bytes 만 다른 것을 확인할 수 있으며, 여기에 있는 값은 감염되기 이전의 EP 값이다. 따라서 이를 토대로 진단 코드를 선정할 수 있다.

우선 위 바이너리를 확인하기 전에 파일의 특징적인 면이 있다. 바로 감염된 파일의 AddressofEntrypoint 가 덧붙여진 코드의 첫 지점(:0x26200, :0x2B200)을 가리킨다는 것이다. 이와 함께 해당 지점에서 파일의 끝(EOF)까지의 크기가 0x118F . 따라서 EOF – 0x118F AddressofEntrypoint 가 가리키는 Offset 이 동일한 위치가 된다. 이를 코드로 짜면 아래와 같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
BOOL FirstDetection(HANDLE hFile)
{
    DWORD lpNumberOfBytesRead;
 
    DWORD NumberofSections;
    DWORD AddressofEntrypoint;
    
 
    DWORD CheckOffset = dwSize - 0x118f;
 
    lpAddr = VirtualAlloc(00x1000, MEM_COMMIT, PAGE_READWRITE);
    ReadFile(hFile, lpAddr, 0x1000&lpNumberOfBytesRead, 0);
 
    pDos = (PIMAGE_DOS_HEADER)lpAddr;
    pNt = (PIMAGE_NT_HEADERS)(pDos->e_lfanew + (BYTE *)pDos);
    pFile = (PIMAGE_FILE_HEADER)(0x4 + (BYTE *)pNt);
    pOption = (PIMAGE_OPTIONAL_HEADER)(0x18 + (BYTE *)pNt);
    pSection = (PIMAGE_SECTION_HEADER)(pFile->SizeOfOptionalHeader + (BYTE *)pOption);
 
    AddressofEntrypoint = pOption->AddressOfEntryPoint;
    NumberofSections = pFile->NumberOfSections;
 
    for (int i = 0; i < NumberofSections; i++)
    {
        if (AddressofEntrypoint > pSection->VirtualAddress && AddressofEntrypoint < (pSection->VirtualAddress + pSection->Misc.VirtualSize))
        {
            EPOffset = AddressofEntrypoint - pSection->VirtualAddress + pSection->PointerToRawData;
        }
        pSection++;
    }
    pSection--;
 
    if (CheckOffset == EPOffset)
    {
        return TRUE;
    }
    return FALSE;
}
cs

위 코드를 통해 선진단을 하여 1차 분류를 한다. 조건에 부합한 파일에 다시 진단을 하여 핵심 코드 부분을 비교하여야 한다. 본 진단에서 사용할 바이너리는 두 부분으로 나누었다. 하나는 선진단에서 찾은 EP Offset 에서의 바이너리를 비교할 것이고, 다른 하나는 아래 그림에 나타낸 0x100 만큼의 크기이다. 해당 부분은 파일을 감염시키는 부분의 코드로 감염형 악성코드에서 중요한 부분이라 할 수 있다.

이러한 조건들을 다음과 같은 코드로 구성하여 비교할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
BOOL LastDetection(HANDLE hFile)
{
    DWORD lpNumberOfBytesRead;
 
    PVOID tmp;
    char ReadBuffer1[0x20];
    char ReadBuffer2[0x100];
    char CheckBuffer1[0x20= { '\x60','\x78','\x03','\x79','\x01','\xEB','\xE8','\x74','\x11','\x00','\x00','\x8B','\x74','\x24','\x20','\xE8','\x11','\x00','\x00','\x00','\x61','\x78','\x03','\x79','\x01','\xEB','\x68'};
    char CheckBuffer2[0x100= {'\xC8''\x00''\x00''\x00''\x60''\x81''\xEC''\x00''\x10''\x00''\x00''\x8B''\xFC''\x68''\x00''\x10''\x00''\x00''\x57''\xFF''\x75''\x08''\xFF''\x56''\x34''\x0F''\xB7''\x47''\x3C''\x03''\xF8''\x3B''\xFD''\x0F''\x87''\xE4''\x00''\x00''\x00''\x66''\x81''\x3F''\x50''\x45''\x0F''\x85''\xD9''\x00''\x00''\x00''\x81''\xBF''\x9B''\x01''\x00''\x00''\x79''\x6C''\x50''\x7A''\x0F''\x84''\xC9''\x00''\x00''\x00''\x8D''\x9F''\xF8''\x00''\x00''\x00''\x0F''\xB7''\x4F''\x06''\x49''\x83''\xC3''\x28''\xE2''\xFB''\x3B''\xDD''\x0F''\x87''\xB1''\x00''\x00''\x00''\x8B''\x47''\x28''\x2B''\x43''\x0C''\x72''\x23''\x03''\x43''\x14''\x6A''\x00''\x50''\xFF''\x75''\x08''\xFF''\x56''\x3C''\x50''\x8B''\xC4''\x6A''\x04''\x50''\xFF''\x75''\x08''\xFF''\x56''\x34''\x58''\x66''\x3D''\x60''\xE8''\x0F''\x84''\x86''\x00''\x00''\x00''\x81''\x4B''\x24''\x00''\x00''\x00''\xE0''\x6A''\x02''\x6A''\x00''\xFF''\x75''\x08''\xFF''\x56''\x3C''\x83''\xF8''\xFF''\x74''\x70''\x50''\x05''\x8F''\x11''\x00''\x00''\x2B''\x43''\x14''\x89''\x43''\x10''\x8B''\x53''\x08''\x3B''\xC2''\x72''\x16''\x89''\x43''\x08''\x8B''\x4F''\x38''\x49''\x03''\xC1''\x03''\xD1''\xF7''\xD1''\x23''\xC1''\x23''\xD1''\x2B''\xC2''\x01''\x47''\x50''\x59''\x2B''\x4B''\x14''\x03''\x4B''\x0C''\x87''\x4F''\x28''\x03''\x4F''\x34''\xE8''\x00''\x00''\x00''\x00''\x5F''\x81''\xEF''\x13''\x0E''\x00''\x00''\x89''\x0F''\x83''\xEF''\x1B''\x68''\x8F''\x11''\x00''\x00''\x57''\xFF''\x75''\x08''\xFF''\x56''\x38''\x83''\xF8''\xFF''\x74''\x18''\x6A''\x00''\x6A''\x00''\xFF''\x75''\x08''\xFF''\x56''\x3C''\x8B''\xC4''\x68'};
    
    SetFilePointer(hFile, EPOffset, 00);
    ReadFile(hFile, ReadBuffer1, 0x20&lpNumberOfBytesRead, 0);
 
 
    OrigEP = (BYTE)ReadBuffer1[0x1b];
    OrigEP += (BYTE)ReadBuffer1[0x1c]*0x100;
    OrigEP += (BYTE)ReadBuffer1[0x1d]*0x10000;
    OrigEP += (BYTE)ReadBuffer1[0x1e]*0x1000000;
    OrigEP -= pOption->ImageBase;
 
    SetFilePointer(hFile, EPOffset + 0xd5800);
    ReadFile(hFile, ReadBuffer2, 0x100&lpNumberOfBytesRead, 0);
 
    for (int i = 0; i < 0x1b; i++)
    {
        if (ReadBuffer1[i] != CheckBuffer1[i])
        {        
            /* Check a aml data size at mal's data[0xdf6]&[e3c] */
            return FALSE;
        }
    }
 
    for(int i=0; i< 0x100; i++)
    {
        if(ReadBuffer2[i] != CheckBuffer2[i])
        {
            return FALSE;
        }
    }
 
    return TRUE;
}
cs

이러한 진단 코드를 통해 감염된 파일들을 탐색하면 올바르게 진단하는 것을 확인할 수 있다.

위와 같이 진단을 한 다음 감염된 파일들을 치료하여야 한다. 우선 파일 뒷부분에 덧붙여진 0x118F 만큼을 잘라내는 것과 PE 헤더의 AddressofEntrypoint 를 올바르게 수정해주어야 한다. 그리고 파일을 실행에 직접적으로 관련이 있는 SizeofRawData 의 값도 수정해주어야 한다. 이는 다음과 같은 코드로 나타낼 수 있다.



5. 결론

제작한 코드로 치료한 결과는 아래의 표와 같다. 아래의 표는 국내 모 백신이 치료한 파일들의 MD5 값과 직접 제작한 코드로 치료한 파일의 MD5 를 비교한 것으로 해시 값이 동일한 것을 확인할 수 있다

하지만 위 두 번째 표와 같이 감염형 악성코드를 치료했다는 것이 감염 이전과 완전히 동일하는 것을 뜻하지는 않는다. 물론 가능하다면 이전과 완전히 동일하게 하는 것이 가장 이상적이지만, 감염형 악성코드가 동작할 때 기존 파일의 정보를 모두 보존하지는 않는다. 그렇기에 복구할 수 없는 부분도 존재하게 된다. 또한 정책적인 면에서 위험의 소지가 있다면 최소한만큼만 수정하는 경우도 있다. 그러므로 치료되었음에도 감염 이전과 해시 값이 다르게 나타나는 경우도 빈번하다.


악성코드 분류

Kail-KM
|2016. 3. 3. 00:16

1. 악성코드란


악성코드란 악성 행위를 위해 개발된 컴퓨터 상에서 동작하는 모든 실행 가능한 형태이다. 이는 사용자의 의사와 이익에 반해 시스템을 파괴하거나 정보를 유출하는 등 악의적인 활동을 수행하도록 의도적으로 제작된 소프트웨어를 말한다. 보통 악성코드라 하면 EXE 파일이 떠오르지만, 이외에도 JS와 같은 스크립트나, 개발자의 실수로 만들어진 버그 또한 악성코드라 분류할 수 있다.

악의적으로 사용된다는 뜻의 악성코드는 어디에 사용될까? 이에 대한 답은 다양하다. 악성코드의 대상은 사회 기반 시설에서부터 산업 기밀을 목적으로 기업을 대상으로 할 수 있다. 이처럼 특정한 목표를 갖는 것 외에도 일방적으로 많은 이들에게 감염시키고자 하는 예도 있다. 랜섬웨어나 DDoS에 사용될 악성코드의 경우 많은 사용자들을 감염시켜야 더 많은 금액을 취하거나, 더 강력한 DDoS 공격을 수행할 수 있다. 결국, 공격자는 개인 정보 수집, DDoS 공격, 변조 및 신분 절도, 금전 요구 등 다양한 목적에 맞게 악성코드를 설계하며, 이러한 악성코드는 하나의 기능이 아닌 여러 기능을 수행하고자 복합적으로 제작되기도 한다.

이렇게 다양한 기능의 악성코드들이 존재하는 만큼 다양하게 분류될 수 있다. 악성코드는 동작 방식에 따라 크게 네 가지 항목으로 분류할 수 있고, 이는 다시 목적에 따라 여러 개의 항목으로 분류할 수가 있다. 다음 장에서부터 이러한 분류에 대하여 알아보자.


2. 동작에 의한 분류


악성코드가 어떠한 방식으로 동작하는지에 따라 분류해보자. 이 경우 크게 네 가지 항목으로 나눌 수가 있는데 바로 일반 사용자들에게도 익숙한 이름의 'Virus', 모리스에 의해 세상에 알려진 'Worm', 생소한 단어의 'PUP', 마지막으로 그리스 신화에서 들어본 'Trojan'이다. 수많은 악성코드가 존재하지만, 어떻게 동작하는지에 따라 이렇게 네 가지로 분류할 수 있다.

하지만 점차 보안이 발전하는 만큼 악성코드 또한 진화하고 있기에 더 이상 하나의 방식이 아닌, 두 가지 이상으로 복합되어 나타나기도 한다. 복합된 방식의 악성코드 또한 새로운 이름으로 분류되어 있지만 모두 이 네 가지를 토대로 나타난 것이기 때문에 이에 대해 알아야 한다. 이들에 대한 기초적인 지식 없이 새로운 악성코드를 이해하기는 어렵다. 따라서 우선 네 가지 방식에 대한 이해를 목표로 하자. 이제 각 분류된 이름들이 어떻게 동작하는지 알아보자.

2.1 Virus

사람이 어떠한 바이러스에 걸려 아프다는 것처럼 컴퓨터도 어떠한 바이러스에 걸렸다는 단어가 잘 어울린다. 이처럼 우리는 악성코드란 이름보다 바이러스라는 단어를 더 친숙하게 생각한다. 하지만 바이러스와 악성코드는 유사하면서도 다르다. 바이러스가 악성코드 중 하나의 분류로 악성코드와 동의어가 아니다. 그렇다면 보안이 생소한 일반 사용자들에게 왜 '악성코드'라는 단어보다, '바이러스'라는 단어가 더 자주 사용될까?

1986년 최초의 개인용 컴퓨터 바이러스인 브레인 바이러스가 나타났다. 이후 바이러스는 점차 진화하며 이전에는 보이지 않는 방식으로 동작하는 것을 확인할 수가 있었다. 이에 따라 유사하면서도 차이가 있는 바이러스를 구분하기 시작하였고, 이러한 모든 범주를 포괄하여 지칭하는 것이 바로 'Malicios Softwae' 혹은 'Malicios Code'가 된 것이다. 바이러스라는 이름으로 먼저 사용되었기에, 일반 사용자들의 입장에서는 굳이 구분 지을 필요가 없던 것이다. 바이러스와 악성코드가 다름을 알아보았으니 이제 바이러스가 어떠한 것인지 구체적으로 알아보자.

바이러스가 실행될 경우 바이러스는 새로운 매개체(파일)를 찾는다. 새로운 매개체를 찾은 바이러스는 대상의 PE 구조를 변경하거나, 코드를 삽입하는 등의 방식으로 자신이 가지고 있는 악의적인 행위를 다른 파일 또한 하도록 조작한다. 더 이상 감염시킬 대상이 없을 때까지 감염하며 바이러스 제작자가 의도한 기능을 지속해서 수행하게끔 한다. 바이러스의 감염성은 실제 생활에서 바이러스에 걸린 환자가 다른 지역에 갈 경우 새로운 지역 또한 바이러스에 감염될 수 있듯이, 최초 감염된 PC의 파일이 다른 PC로 옮겨져 실행될 경우 마찬가지로 새로운 매개체를 찾게 되어 다시 감염 동작을 시행한다.

문제는 감염을 시작한 바이러스가 일반적인 파일들만 감염시키는 것이 아니라 플로피 디스크와 하드 디스크 파티션의 볼륨 부트 레코드, 마스터 부트 레코드 등 감염시킬 수 있는 영역은 결코 작지 않다. MBR이 감염될 경우 사용자가 MBR을 복구하거나 운영체제를 다시 설치해야 하며, 만약 서버가 이러한 바이러스에 걸릴 경우 피해액은 더욱 커진다.

이와 같이 바이러스는 자기 자신을 복제하며 활동하는 것에 대해 알아보았다. 그렇다면 이러한 바이러스는 어떻게 없애야 할까? 여기서 '치료'라는 개념과 '제거'라는 개념의 차이에 대해 알아야 한다. 치료란 '[명사] 병이나 상처 따위를 잘 다스려 낫게 함.'과 같이 이상이 생긴 부분을 원래의 형태가 되도록 함이다. 반대로 제거란 '[명사] 없애버림.'으로 이상이 있는 부분을 삭제하는 것이다. 컴퓨터 바이러스의 경우 대상이 된 모든 파일의 구조가 바이러스가 의도한 대로 변조되었기 때문에, 이를 '치료'한다라고 표현한다. 단, 최초 감염을 실행한 숙주 파일의 경우 '제거'되는 것이 맞다. 

바이러스에 대해 정리하자면 최초 숙주 파일이 실행되며 다른 매개체로 감염이 시작된다. 그리고 이러한 매개체가 다른 사용자의 PC로 옮겨져 실행될 경우 해당 PC 또한 감염된다. 감염은 일반적인 파일뿐만 아니라 VBR이나 MBR까지 감염될 수 있으므로 유의하여야 한다. 제작자에 의해 최초 제작된 EXE 파일의 경우 제거되는 것이 맞지만, 숙주로부터 감염된 다른 파일들은 치료되어야 한다. 또한 새로운 PC로 옮겨진 파일은 최초의 숙주가 아니므로 이 역시 치료되어야 함이 맞다.

2.2 Worm

최초의 웜은 네트워크에서 활동이 적은 프로세서들을 찾아 업무를 할당하고 연산 처리를 공유하여 전체적인 네트워크의 효율을 높이도록 설계되었다. 하지만 이러한 웜이 악성코드가 된 것은 저명한 모리스에 의해 개발된 '모리스 웜' 때문이다. 모리스가 제작한 이 웜은 인터넷에 연결된 수많은 컴퓨터들을 빠른 속도로 감염시켰으며, 당시 운영체제들의 많은 버그들을 통해 확산되었다.

이렇듯 웜은 운영체제나 응용 프로그램의 취약점을 찾아 네트워크를 통해 전파되며, 바이러스가 다른 매개체들을 찾아 변조하므로 감염시키는 것에 반해 스스로 자기 자신을 복제하며 운영체제의 취약점을 통해 연결된 다른 네트워크로 전이하는 형태로 진행된다. 이는 인터넷이 발달함에 따라 웜이 한번 실행될 경우 이전보다 더욱 빠른 속도로 퍼지게 된다. 만약 웜이 실행되면 해당 PC에서 자신을 끊임없이 복제하게 되므로 메모리와 CPU에 과부하가 걸리게 되며, 연결된 네트워크로 전이하므로 해당 네트워크의 PC 또한 감염될 수 있다.

바이러스의 경우 '치료'라는 단어를 사용하였지만, 웜의 경우 다른 파일을 변조하지 않고 끊임없이 자신을 복제하기 때문에 제거해야만 한다. 또한 웜이 공격할 수 있는 보안상의 취약점을 방지하기 위해 지속적인 보안 업데이트가 필요하다.

2.3 PUP

PUP는 'Potentially Unwanted Program'의 약자로 우리말로 번역하면 '잠재적으로 원하지 않는 프로그램'이라 할 수 있다. PUP의 경우 다른 악성코드들과 가장 큰 차이점이 존재한다. 대개 악성코드는 사용자가 동의하지 않고 설치되지만, PUP의 경우 사용자의 동의가 포함되었기에 따로 분류된다. 그렇다면 사용자들은 악성코드로 분류되는 PUP에 대해 왜 동의하는 것일까? 이는 컴퓨터에 프로그램을 직접 설치해본 사람이라면 알 수 있듯이, 무료로 이용할 수 있는 많은 프로그램 중에서 설치를 진행할 때 설치하고자 하는 프로그램이 아닌 다른 제품까지 추가로 설치하겠냐고 묻는 항목에 기본적으로 체크가 되어 있다. 이러한 체크 항목이 분명히 나와 있지만, 충분히 사용자가 놓칠 수 있다. 이와 같이 PUP는 약관이 존재하며 사용자에게 동의까지 받지만, 이 동의가 결코 자의적으로 행해진 것은 아니다.

 

이러한 PUP는 로그인할 때마다 광고하고자 하는 웹 사이트의 바로가기를 바탕화면에 생성하거나, 웹 브라우저의 기본 페이지를 변경, 웹 페이지 접속 시 특정 광고가 지속적으로 노출되는 등으로 PC나 인터넷 접속이 느려지는 등 사용자에게 불편함을 준다. 이렇게 사용자의 자의적인 선택 아닌 동의로 설치된 PUP는 제거하는 방법 또한 까다로운 경우가 많다. 설치는 되었음에도 불구하고 제거와 관련된 기능이 없거나 이를 사용자가 찾기 어렵게 숨긴다.

 

어떻게 보면 사용자에게 불편함만을 주기 때문에 어찌 보면 악성코드로 부르기 모호한 점이 있다고 느낄 수 있다. 하지만 2014년 조사 결과에 따르면 전체 악성코드 감염의 24.77%가 PUP라는 점과 대부분 광고가 목적이다 보니 허술한 보안 관리로 인해 파밍이나 공인인증서 탈취를 위한 악성코드 등의 전파 경로로 악용된 사례가 존재하기 때문에 사용자의 주의가 필요하다. 

2.4 Trojan

트로이 목마(Trojan Horse)는 그리스와 트로이 사이의 전쟁에서 유래된 것이다. 당시 그리스와 트로이는 10여 년간 전쟁을 치르고 있었으나 그리스가 목마를 만들어 그 안에 병사들을 매복시킨 후 퇴각한 척한다. 이후 트로이 군은 이 목마를 승리의 상징으로 이를 가지고 갔지만, 결국 그 안에 있던 병사들이 나타나 트로이의 성문을 열어 그리스가 승리하게 된다.

위의 이야기처럼 그리스는 자신이 의도하는 바를 트로이에게 숨겨 이를 가지게끔 했으며, 트로이가 이를 가지고 간 후 그리스가 의도한 대로 되었다. 악성코드의 트로이 목마도 마찬가지로 공격자가 의도하는 바를 위하여 대상을 속인 다음 실행되었을 경우 숨겨져 있던 기능을 수행한다. 이에 대해 많은 곳에서 '정상적인 파일로 위장하여'라 정의하지만, 누가 보아도 비정상적으로 보이면서 웜, 바이러스, PUP가 아닌 경우 이러한 정의에서 벗어난다. 

따라서 이에 대해 다시 정의하자면 바이러스와 같이 다른 파일을 변조하지 않고, 웜과 같이 네트워크를 통한 전파나 자가 복제가 이루어지지 않으며, 마지막으로 PUP와 같이 사용자의 동의가 이루어지지 않았을 때 'Trojan'으로 분류해야 한다. 바이러스나 웜 또한 최초 실행되고자 할 때는 정상적인 파일처럼 보여 사용자가 실행되게끔 할 수 있다. 이러한 점을 고려했을 때, 어떠한 동작을 하는지 모르는 프로그램이 있는데 위 세 가지에 해당이 되지 않을 경우 트로이 목마라 하는 것이 더욱 정확하다고 본다. 이러한 트로이 목마는 네 가지 분류 중에서 가장 많이 사용되고 있으며, 목적에 따라 다양한 기능을 갖기도 한다. 마지막으로 트로이 목마 또한 '치료'가 아닌 '제거'의 개념이 더욱 적절한 조치이다.

  

3. 목적에 의한 분류


지금까지 동작 방식에 따라 크게 네 가지로 구분하였으며, 이러한 네 가지 방식은 목적에 따라 상이한 동작을 수행하게 된다. 이러한 목적에 따라 다양한 종류로 구분할 수 있으며 하나의 분류에서 또다시 기능에 따라 더 세분화될 수 있지만 그러면 너무 많은 종류로 구분될 수 있기에, 목적에 따라 크게 분류하였다. 단, 목적에 따라 분류가 되어 있다고 하여 이들을 개별적인 속성으로 간주하면 안 된다. 점차 악성코드가 진화함에 따라 하나의 악성코드가 여러 기능을 가지고 있는 경우가 많이 나타나기 때문이다. 따라서 이번 장에서는 어떠한 목적이나 기능을 수행하는 악성코드가 어떻게 명명되었는가에 대하여 정리해보자.

3.1 Downloader 

다운로더는 이름에서와 같이 파일을 내려받는다. 여기서 다운로드는 정보통신망에 접속한 사용자가 원격지 컴퓨터나 인터넷상에 있는 파일을 자신의 PC에 전송받는 것을 의미한다. 우리가 사용하는 프로그램 중에서 외부로부터 다운로드 동작을 수행하는 것이 많기 때문에, 어디서 무엇인가 다운로드하는 것 자체만으로는 악의적이라 할 수 없다. 

그렇다면 어떠한 경우에 악의적인 다운로드가 될까? 다운로드 기능이 있는 프로그램 자체가 악의적이지 않다는 것은 안티바이러스 제품을 통해서도 알 수 있다. 따라서 악성코드 제작자들은 이러한 점을 이용하는 것으로, 다운로드하는 행위 자체만으로는 초기에 차단되지 않고 실행될 수 있기에 다운로드 기능만을 포함하고 있는 프로그램을 만드는 것이다. 차단되지 않고 존재하고 있는 프로그램을 사용자가 실행하였을 경우 외부로부터 추가적인 악성코드를 다운받으므로, 이후의 동작을 위한 목적이라 볼 수 있다.

3.2 Dropper

드롭퍼의 경우 다운로더와 유사하게 새로운 파일을 생성한다. 단, 다운로더가 외부에서 파일을 다운받는 것에 반해 드롭퍼의 경우 자기 자신 안에 존재하고 있는 데이터들을 통해 새로운 파일을 생성하는 것이다. 보통 드롭되는 파일들은 원래의 파일 안에 압축되어 있으므로 실행해보지 않을 경우 이에 관하여 확인하기 어렵다. 

분석가는 다운로더와 드롭퍼가 새로운 파일을 생성한다는 점에서 이러한 추가적인 파일 또한 분석을 진행하여야 한다. 드롭퍼와 다운로더 모두 다음 단계를 위한 준비 동작으로 볼 수 있기 때문이다. 여기서 인젝터(Injector)라 불리는 악성코드 또한 드롭퍼의 특수한 형태로, 파일을 생성하지 않고 해당 데이터를 바로 새로운 프로세스로 생성하여 메모리에 놓기도 한다.

인젝터의 경우를 제외하고 다운로더와 드롭퍼 모두 아래의 런처(Launcher)를 통해 실행될 때가 많으며, 대부분 이 두 가지의 기능을 가지고 있을 경우 런처의 기능 또한 가지고 있는 경우가 많다.

3.3 Launcher

다운로더와 드롭퍼가 새로운 파일을 생성하였다 하더라도, 추가적인 악성 행위를 하기 위해선 새로운 파일 또한 실행되어야 한다. 하지만 어떤 사용자가 이유도 알 수 없이 생성되어 있는 파일을 실행할까. 그렇기에 이들을 실행하기 위한 기능이 필요하게 되었고, 바로 이를 기능과 같이 런처(Launcher)라 하게 되었다.

이미 추가로 실행하고자 하는 파일이 대상 PC에 존재할 경우 런처는 혼자서 사용될 수 있다. 하지만 대부분의 경우 그러한 파일이 대상 PC에 존재하고 있지 않기 때문에, 혼자 사용되는 것보단 다운로더나 드롭퍼의 기능과 함께 사용되는 경우가 일반적이다. 그러므로 분석을 하는 데 있어 어떠한 대상을 실행하고자 하는지 파악하는 것이 먼저이며, 만약 그 실행 대상을 찾았을 경우 그 대상 또한 추가적으로 분석해야만 한다.

3.4 Adware

인터넷이 발달하며 이에 따라 인터넷을 통해 광고하는 것에도 비용이 많이 소모된다. 애드웨어(Adware)는 소프트웨어 자체에 광고를 포함하거나, 같이 묶어서 배포한다. 이는 프로그래머가 개발하면서 개발 비용을 충당할 수 있게 해주며, 광고주의 입장에서는 포털 사이트에 배너를 놓는 것보다 비용이 저렴하기 때문이다. 

개발자와 광고주 둘 모두에게 이윤이 되기에 애드웨어가 많이 배포되고 있으며 주로 다른 프로그램을 설치할 때 동의 항목에 체크가 되어 있듯이, PUP 방식을 통해 설치되는 경우가 많다. 이렇게 사용자의 인식 없이 설치된 애드웨어는 인터넷 시작 페이지를 바꾸거나 광고와 관련된 알림 창을 띄우며 바탕화면에 광고하고자 하는 페이지의 바로가기를 지속해서 생성하기도 한다.

개발자와 광고주에게는 Win-WIn이지만 정작 그들에게서 상쇄된 손해는 일반 사용자들의 몫이 되었다. 과도한 애드웨어로 인해 PC에 불필요한 프로그램이 많아지며, 인터넷의 속도를 저하하기도 한다. 또한 무차별적인 광고로 인해 사용자가 미성년자임에 불구하고 성인물 사이트와 관련된 광고를 보이기도 한다. 마지막으로 애드웨어의 경우 광고만이 목적이다 보니 제작되는 과정에서 많은 부분이 고려되지 않을 수가 있으며, 이것이 응용 프로그램 상의 취약점을 갖게 될 경우 다른 악성 프로그램들에 의하여 악용될 소지가 있다.

3.5 Spyware

스파이라는 단어는 어떠한 곳에 침투하여 정보를 빼내어 가는 사람을 말할 때 주로 사용한다. 스파이웨어의 경우도 마찬가지로 개인이나 기업의 정보를 그들이 알지 못하게 수집하며, 이러한 정보를 동의 없이 다른 곳으로 보내기도 한다. 일반적으로 자신의 존재를 사용자로부터 숨겨 탐지가 어렵게 사용자의 컴퓨터 조작을 방해하며, 또한 사용자의 컴퓨터를 지켜보는 것에 그치지 않고 인터넷 검색 흔적이나, 사용자 로그인, 은행이나 신용 계좌 정보 등 거의 모든 유형의 정보를 수집하기도 한다.

스파이웨어는 거의 컴퓨터에서 혼자 존재하지 않고 한 번 감염된 컴퓨터에서 안티바이러스나 방화벽을 비활성화하고 브라우저의 보안 설정을 낮추므로 시스템이 추가적으로 감염 기회에 노출되도록 한다. 이렇듯 스파이웨어에 감염되면 원하지 않은 막대한 양의 CPU 활동, 디스크 사용, 네트워크 트래픽 등이 생성될 수 있다.

이를 제작한 공격자들이 원하는 것은 일반적으로 '정보'이기 때문에 많은 정보를 수집하기 위해 개인 PC뿐만 아니라 사람들이 많이 오가는 공용 도서관이나 PC방과 같은 곳 또한 선호한다. 여기서 스파이웨어가 더욱 문제화되는 것은 범죄자들만 스파이웨어를 이용하는 것이 아니라 정부에서 민간인이나 다른 주요 기업들을 감시하고자 사용하고자 하는 경우가 있기 때문이다. 만약 정부에서 이러한 기능을 일반 사용자들이 많이 사용하는 제품에 추가할 경우 정부가 사용자의 일거수일투족 감시가 가능하게 되기 때문에 충분히 압력을 넣을 수가 있다. 이러한 경우 해당 제품 제조사의 윤리성을 믿어야 하기에 일반 사용자의 입장은 난처할 수밖에 없다.

스파이웨어는 많은 기능을 포함한 말로 이는 다시 패스워드 스틸러나 키로거와 같이 세분화될 수 있다. 패스워드 스틸러의 경우 브라우저를 통해 로그인한 사용자의 정보를 탈취하며, 키로거의 경우 사용자가 입력하는 모든 키 이벤트를 공격자에게 전송한다. 하지만 점차 진화하므로 더 이상 키 이벤트가 아니라 어떠한 화면을 보고 있는지, 캠이나 마이크가 있을 경우 어떠한 모습으로 어떠한 소리와 함께 사용자가 존재하고 있는지까지 공격자에게 노출될 수 있다. 따라서 개인정보가 중요시되는 만큼 스파이웨어는 컴퓨터가 아닌 우리 자신에게 치명적인 피해를 줄 수 있기에 더욱 주의해야 한다.

3.6 Ransomware

랜섬웨어란 Ransom(인질의 몸 값)과 Software의 합성어로 최근 급격히 퍼지고 있는 악성코드이다. 사용자에 의해 랜섬웨어가 실행될 경우 파일에 대한 암호화를 진행하며 이를 사용자가 실행이나 읽을 수 없도록 하여 사용자의 자료를 인질로 잡고 돈을 요구한다.

실행될 경우 악성코드 제작자가 정의한 조건에 해당하는 모든 파일이 암호화되는데, 주로 강력한 암호화 방식을 사용하기 때문에 복호화가 매우 어렵다. 여기서 랜섬웨어 제작자가 의도하는 것은 사용자가 돈을 지불하는 것으로 다시 파일들을 이용하고 싶을 경우 어디로 돈을 보내야 하는지 등의 안내문을 같이 출력하는 경우가 많다. 주로 암호화되는 확장자는 문서나 사진과 관련된 부분이 많으며, 암호화된 주요한 문서나 사진들에 더 이상 접근할 수 없게 된다. 

기업의 경우 중요한 프로젝트와 관련된 자료들이 한 순간에 모두 암호화돼버리면 이에 따른 손해액이 크게 증가한다. 따라서 이들은 결국 돈을 지불해서라도 자료들을 복호화하고자 하게 된다. 하지만 문제는 정작 금액을 지불하더라도 복호화가 진행되지 않는 경우가 많다는 점에서 더욱 큰 문제가 되고 있다. 결국 암호화된 자료는 더 이상 사용할 수 없게 되어버리는 것이나 마찬가지다.

이러한 랜섬웨어가 점차 진화하면서 새로운 기능들이 계속 추가되고 있다. 암호화가 진행되는 도중 프로세스를 종료하지 못하도록, 프로세스를 종료시킬 수 있는 다른 프로세스의 실행을 방해하기도 하며, 볼륨 쉐도우 카피에서 파일을 복원하지 못하도록 이를 제거하기도 한다. 따라서 실질적으로 한번 암호화된 파일은 거의 복구가 불가능하기 때문에 백업과 같은 사전 대비가 가장 중요한 화두가 된다.

3.7 Backdoor

백도어는 이름에서와 같이 '뒷 문'이라는 뜻으로, 원래는 시스템의 유지 보수나 유사시 문제 해결을 위하여 시스템 관리자가 보안 설정을 우회한 다음 시스템에 접근할 수 있도록 만든 도구이다. 하지만 최근에는 악의적인 목적을 갖은 공격자들이 쉽게 시스템에 재 침입할 수 있도록 이용하는 경우를 의미할 때가 더 많다.

백도어 프로그램은 비인가된 접근을 허용하는 프로그램으로 공격자가 이후 사용자 인증 과정 등 정상적인 절차를 거치지 않고 프로그램이나 시스템에 접근할 수 있도록 지원한다. 공격자는 시스템에 침입한 이후 재접속을 위해 백도어를 설치하기도 하지만, 프로그래머가 관리 목적으로 만들었다가 제거하지 않은 백도어를 찾아 악용하기도 한다.

대상 PC에 기존의 백도어가 존재하지 않을 경우 공격자는 최초 1회 이상 침투에 성공해야만 한다. 만약 침투에 성공했을 경우 침입한 권한에 대하여 백도어를 설치하게 되고, 이후 다시 접속하여 관리자 권한을 얻으려 할 것이다. 결국 백도어가 존재하고 있을 경우 지속적으로 공격자에게 노출되며 공격당할 수 있다. 출입이 자유로워진 공격자는 더 이상 어떠한 제약을 받지 않고 관리자 권한을 획득하기 위한 작업을 수행할 것이다. 보안 상의 취약점을 공격자가 찾아 관리자 권한을 획득한 경우 대상 PC는 공격자에게 종속된 것이나 다름없다.

3.8 Rootkit

우리가 쓰는 운영체제는 크게 두 개의 계층으로 유저 모드(Ring 3)와 커널 모드(Ring 0)로 이루어져 있다. 커널 모드에는 실제로 운영체제의 핵심적인 작업을 수행하는 코드가 동작하며, 유저 모드는 커널 모드의 코드를 사용하기 위해 API를 사용한다. 루트킷은 주로 커널 모드에 상주하고 있으며 그렇다 하여 유저 모드와 관련이 없는 것은 아니다. 커널 모드에서 작업하기에는 어려운 사항을 유저 모드에서는 간단하게 할 수 있기 때문에, 핵심적인 기능들은 커널 모드에서 수행하며 상대적으로 가벼운 기능들은 유저 모드에서 수행한다. 만약 루트킷이 유저 모드에만 있을 경우 Ring 0의 명령어들을 사용할 수 없으므로 지금과 같이 강력한 루트킷이 존재할 수 없다.

커널 모드에 있는 루트킷은 제한 없이 보안에 접근이 가능하며, 이는 운영체제와 같은 보안 등급을 가지고 운영체제의 작업을 가로채거나 손상시키는 등의 조작을 할 수 있으므로 탐지와 제거가 어렵다. 이러한 경우 시스템의 어떠한 요소도 신뢰할 수 없게 되며 안티바이러스 제품 또한 마찬가지로 취약하게 된다. 

루트킷은 컴퓨터에 접근하거나 일반적으로 허용되지 않는 영역에 접근할 수 있도록 설계된다. 일반적으로 악성코드가 시스템에 설치된 후, 들키지 않고 계속 남아 악의적인 기능을 수행하고자 할 것이다. 루트킷은 이러한 목적과 맞물려 사용되는데, 주로 설치가 자동으로 이루어지며, 공격자는 알려진 취약점 공격이나 패스워드 등을 통해 루트 권한이나 관리자 접근 권한을 획득한다. 이렇게 한번 설치되면 접근 권한을 유지하는 것뿐만 아니라 침입 사실을 숨기며 자신이나 다른 악성코드를 은닉하여 사용자로부터 탐지되지 않으려 한다.

프로세스를 은닉하는 방법으로 윈도우 커널에서 사용하는 Direct Kernel Object Manipulation(DKOM)을 사용하여 데이터 구조를 수정한다. 또한 커널 모드 루트킷은 System Service Descriptor Table(SSDT)를 후킹 할 수 있으며 커널의 기능을 손상시키기 위해 System Call Table을 수정할 수 있다.

높은 권한을 가질 수 있는 루트킷은 자신을 찾고자 하는 소프트웨어를 수정하거나 파괴할 수 있고, 또한 작업 관리자나 Process Explorer로부터 프로세스의 목록을 수정하므로, 자신이나 다른 추가적인 악성코드의 존재를 숨길 수 있다. 만약 침입자가 시스템의 기본 관리 도구를 루트킷으로 대체한다면, 침입자는 시스템의 루트 권한을 얻음과 동시에 정상적인 시스템 관리자로부터 이러한 활동을 은폐할 수 있다. 따라서 루트킷을 탐지하고 완전히 제거하는 것은 어렵다. 특히 루트킷이 커널에 상주하고 있을 경우 더욱 어려워지며 대부분의 경우 이는 운영체제를 재설치하여 해결할 수밖에 없다. 최근의 루트킷은 단순히 접근 권한을 상승시키지 않고, 다른 악성코드와 함께 스텔스 기능을 추가하여 그들의 페이로드를 감추도록 한다. 또한 단순히 프로세스를 숨기는 용도가 아니라 루트킷을 제거하려는 시도가 감지되었을 때 이에 대하여 방해하는 루틴 또한 가지고 있는 경우가 있기에 더욱 유의하여야 한다.

3.9 Exploit

Exploit은 해커가 PC에 침투하고자 공격할 때 사용하는 단어이다. 이러한 단어가 악성코드에도 붙게 된 것은 운영체제나 특정 프로그램의 취약점을 찾도록 설계되기 때문이다. 이러한 취약점은 주로 프로그래머가 실수로 놓친 부분이나, 프로그래머가 전혀 생각하지 못한 부분 등을 공격하는 방식으로 이루어진다. 

이러한 취약점은 공격자가 직접 수동으로 할 수 있지만, 악성코드로 제작하여 배포할 경우 더 많은 사용자에게 자동으로 공격해주므로 더욱 수월해진다. 만약 취약한 부분이 이미 모두 업데이트되어 사라졌다면 해당 Exploit은 아무런 효력을 갖지 못하기 때문에, 실제 Exploit에 대한 예방 방안과 같이 지속적인 보안 업데이트를 유지해야만 한다.

3.10 Botnet

봇넷은 수많은 봇들이 연결된 네트워크로 봇들이 지정된 작업을 수행하도록 통제하기 위하여 연결되어 있다. 일반적으로 Internet Relay Chat (IRC)를 통해 연결되어, 스팸 메일을 보내거나 DDoS 공격 등에 사용될 수 있다. 이러한 봇들은 악성코드에 의해 침투되었을 때 자동으로 생성되거나, 직접 공격자가 컴퓨터에 침투하여 생성하기도 하며, 이렇게 생성된 봇넷을 통제하는 것은 IRC나 HTTP와 같은 표준 네트워크 프로토콜의 형태이다. 봇넷 악성코드는 일반적으로 컴퓨터가 공격자에 의한 명령을 받고 조작될 수 있게 하는 모듈을 설치하며 호스트 컴퓨터에게 연결을 요청하는 패킷을 보낸다. 패킷을 통해 연결이 진행되면 범죄를 목적으로 원격에서 그룹을 제어할 수 있으며 이러한 제어는 Command-and-Control (C&C) 서버에 의하여 이루어진다. 

봇넷을 통해 어떠한 공격이 이루어지는 경우를 알아보자. 우선 봇넷 제작자들은 봇으로 만드는 코드를 포함한 바이러스나 웜을 통해 많은 사용자들의 컴퓨터를 감염시키고자 하며, 봇에 감염된 PC는 C&C 서버와 연결하게 된다. 이렇게 제작자가 많은 봇을 소유하고 있을 때 이를 사용하고자 하는 고객이 금액을 지불하고 수많은 봇넷을 이용할 수 있다. 이러한 과정 중에 봇으로 사용된 PC는 자신이 사용되었다는 것조차 알 수 없는 경우가 많다. 새로운 고객이 봇넷의 제작자에게 다시 어떠한 요청을 하더라도 다시 사용될 수밖에 없다.

3.11 Scareware

스케어웨어(Scareware)는 Scare(겁 주다)와 Software의 합성어다. 이름과 같이 주로 사용자를 깜짝 놀라게 하거나 겁을 주는 형태로 동작하는데, 악성코드처럼 보이지만 실제로 악의적인 기능을 하지 않는다. 보통 실제 악성코드에 감염되지 않았음에도 불구하고, 악성코드 감염을 탐지하였으므로 자사의 안티바이러스 제품을 구매하여 이를 제거해야 한다는 식으로 구매를 유도하는 용도로 많이 사용되고 있다. 이 경우 실제 제품을 구매하더라도 제거되는 것은 바로 스케어웨어이다.

로그 웨어(Rogueware) 또한 이러한 스케어웨어의 변종으로 합법적인 소프트웨어처럼 보이지만 실제로는 사용자를 속이기 위한 상품 광고인 경우가 있다. 이렇듯 대부분의 스케어웨어는 안티바이러스 제품으로 위장하고 있다. 하지만 스케어웨어 또한 점차 진화하여 추가적인 보안 프로그램 설치를 유도하며 사용자가 추가적인 악성코드를 다운로드하도록 한다. 실제 스케어웨어가 진짜 안티바이러스 제품과 유사하게 제작되는 만큼 사용자는 이에 대해 신뢰할 수밖에 없게 된다.


Reference


https://ko.wikipedia.org/wiki/컴퓨터_바이러스

https://ko.wikipedia.org/wiki/웜

https://www.ahnlab.com/kr/site/securityinfo/secunews/secuNewsView.do?menu_dist=2&seq=21481

https://en.wikipedia.org/wiki/Potentially_unwanted_program

https://ko.wikipedia.org/wiki/트로이_목마_(컴퓨팅)

http://yjlee.delighit.net/tag/스케어웨어

https://en.wikipedia.org/wiki/Spyware

https://en.wikipedia.org/wiki/Rootkit

http://malware.wikia.com/wiki/Rootkit

http://codeengn.com/archive/Reverse%20Engineering/Rootkit/Rootkit%20%5Bmoltak%5D.pdf

https://en.wikipedia.org/wiki/Botnet

https://securingthehuman.sans.org/newsletters/ouch/issues/OUCH-201402_kr.pdf

http://jsblab.com/30046494923

http://sergeswin.com/1127#

http://skccblog.tistory.com/837

http://proneer.tistory.com/entry/백도어에-대한-이해

'Reversing > Theory' 카테고리의 다른 글

Yara 규칙 제작 & Python  (1) 2016.03.07
Yara를 사용해보자  (0) 2016.03.06
악성코드 분석 방법  (0) 2016.02.26
악성코드 선호 경로  (0) 2015.09.27
PEB Struct  (0) 2015.09.15

Virus

감염(Infect)이란 바이러스가 명령들의 연결 사이에 자신을 집어넣어서 정당한 프로그램의 실행뿐만 아니라 바이러스의 실행을 유발하도록 하는 것이다.

바이러스의 구조는 세가지 원형을 고려한다. 즉 주요 구성작용을 세가지로 나누어 볼수 있다. 첫째로 감염작용은 바이러스가 퍼지는 방식이나 경로들로 정의, 둘째로 피해작용은 바이러스가 복제 외에 무엇을 하느냐로 정의된다. 셋쨰로 트리거작용은 피해를 일으킬 시기를 결정하는 절차로 정의된다.

피해로는 트래싱이나 부팅불가, 메모리 점유, 디스크 공간 차지, 클럭 싸이클 소모, 시스템 변경 혹은 이들의 조합으로 나타난다.

스텔스 작용으로 은폐 기법을 사용하는 바이러스들은 종종 스텔스 바이러스라고 기술된다.

다형성(Polymorphism)은 자신의 생김새를 변화시켜서 자신의 존재를 탐지하기 어렵게 만들려고 한다. 다형성은 동일한 바이러스를 유지하지만 특성화된 탐색 문장을 찾는 것으로는 감염된 파일에서 찾아지지 않는 것이다. 코드는 본질적으로 동일하게 유지되지만, 표현이 달라서 같은 프로그램이 서로 다른 순서의 바이트로 나타나게 된다.

은 자기복제 프로그램을 의미한다. 그에 비해 트로이 목마는 자기복제를 하지 않는다.

 

바이러스의 역사 고찰

코어 전쟁, 임프(Imp)는 단순히 메모리 상에서 옮겨 다니며, 다니면서 위치를 덮어쓴다. 이것은 크기가 매우 작기 떄문에 임프를 찾아내고 죽이는 것은 매우 어렵다.

화면 뒤집기, 음향소리 추가등 성가신 것들도 존재한다.

  

피해

데이터 덮어쓰기, 파일 지우기, 시스템 정보 빼내기, 디스크 포멧, 보안 시스템 무력화, 소프트웨어 오염, 프로그램 프로세스제거 등을 통한 손상

바이러스와 트로이 피해로 인한 직접적 충격

유용성에 대한 공격 : 파일과 하위 디렉터리의 삭제, 파일 이름변경, 파일, 디스크, 혹은 시스템 영역의 암호화

완전성에 대한 공격 : 시스템 영역의 이동을 포함해서 임의적인, 혹은 비임의적인 디스크 쓰기에 의한 시스템 파일과 시스템영역(DOS | MBR )에 대한 오염, 데이터몰락으로 스프레드 쉬트 형식의 왜곡과 같은 대상 데이터 파일의 변경, 권한 없는 파일 쓰기에 의한 어플리케이션 파일과 데이터 파일 오염

기밀성에 대한 공격 : 비밀번호 획득과 전달, 개인적인 기밀 파일을 다른 곳으로 전달


Bomb

Logic Bomb특정 조건들이 만족될 때 실행되는 루틴이나 루틴의 집합이며, 바이러스나 트로이의 구성 요소가 될 수 있다.

Time Bomb논리 폭탄의 특수한 경우이며, 시작 조건이 특정 시간이나 날짜가 된다.

ANSI Bomb : 키보드의 키, 혹은 키들을 재정의 하는 ASNI.SYS에 의해서 번역되는 문자들의 연속이다. 그에 따라 이 키들은 일반적으로 할당된 문자 대신에 재정의 된 문자열을 보내게 된다.

   

File Virus

기존의 프로그램 코드를 덮어씌우거나 프로그램의 시작부분이나 마지막 부분에 코드를 추가하거나 정상적인 코드가 실행되는 중에 바이러스 코드가 실행될 수 있도록, 명령들의 연결 사이에 바이러스 코드를 집어 넣는다.

올리디버거를 통하여 바이러스 코드를 뒷부분에 넣은 후 맨앞에서 점프문을 통하여 그 부분으로 진행 되었다가 바이러스 코드의 가장 뒷부분에 다시 점프문을 넣어줌으로써 다른 파일에 섞일수 있다. (Prepending & Appending)

  

위험충격분석

생산성 저하-서비스 거부 비용: 감염된 시스템의 성능 저하, 손상된 어플리케이션의 신뢰 불가, 손상된 시스템의 사용 불가, 손상되거나 접근할 수 없는 데이터의 사용 불가

관찰되지 않은 영향 : 성능저하, 탐지되지 않은 데이터 피해, 어플리케이션 피해, 디스크 I/O손상, 불법 자원사용, 탐지되지 않은 증식과 이차 감염

관찰된 영향 : 심각한 성능 저하, 진단되지 않은 시스템 오류, 디스크나 데이터에 대한 장기적인 피해, 진단되지 않은 오류에 쓰여진 서비스 시간비용, 신뢰할수 없는 어플리케이션, 생산성의 손실로 인한 대체이익의 손실

 

과거의 바이러스

Jerusalem Virus : 파일 감염에 있어서 가장 많은 수의 변종을 가진 바이러스 프로그램으로 감염된 파일이 실행되면, 자신을 메모리에 인스톨 시켜서 원조 감염 프로그램이 삭제되더라도 여전히 남아 활동하게 된다. 파일에 추가된 바이러스 코드는 프로그램이 기생하게 된 이후 실행된 .exe 프로그램들을 감염시킨다. 대부분의 변종은 일종의 날짜 논리 폭탄 하중을 탑재한다.

AIDS Trojan : 하드 디스크를 암호화 후 키에 대한 요금을 청구했다. Ransomware와 비슷한 원리인것 같다.

Stoned Virus  : Stoned is the name of a boot sector computer virus created in 1987.

Michelangelo : 현재는 멸종된 바이러스로 요즘 출시되는 시스템에는 달려있지 않은 플로피디스크로만 전파되는 부트바이러스다.

AutoOpen ( or AutoStart) :

Chernobyl ( CIH.Spacefiller ) : PC에 장착된 하드디스크 안에는 새로운 파일을 저장할 때마다 공간을 지정해주는 주소록 기능을 수행하는 부분이 있는데, 이 바이러스는 바로 이곳을 파괴한다. 때문에 바이러스에 감염되면 PC가 어디에 무엇이 저장되어 있는지 파악할 수 없는 혼란에 빠져 파일을 복구할 수 없게 된다. 만약 기본 입출력 시스템(BIOS)이 감염되면 기판이나 플래시메모리칩을 교체해야 한다. 이 바이러스에 감염된 파일이 실행되면 기억장소에 상주한 뒤 윈도95에서 실행되는 파일을 계속 감염시킨다.

RootKit : 시스템 침입 후 침입 사실을 숨긴 채 차후의 침입을 위한 백도어, 트로이목마 설치, 원격 접근, 내부 사용 흔적 삭제, 관리자 권한 획득 등 주로 불법적인 해킹에 사용되는 기능들을 제공하는 프로그램의 모음.


참고


트래싱(Trashing)

임프, 제록스웜,,부트섹터 바이러스, 브레인바이러스, 예루살렘바이러스, Frodo_Virus, Dark Avenger, AIDS 트로이, 미켈란젤로, 르네상스, 데키랄선라이즈, Hoax, 백오리피스, 스크립트바이러스, 멜리사, 오토런이 지원되는 usb에는 무엇이 있을까?, 확장자명 변경 바이러스, 레지스트리 변경, 원격접근(Remote-Control Software), 루트키트(RootKit), 실행 후 원본 파일을 삭제하는 프로그램, 다른 프로그램을 감염시키는, 메일을 통한 바이러스 전달, 키로거

정상적인 프로그램을 바이러스로 감지되도록 하여 백신이 차단하게끔 하는 방법

 

'Study > Book' 카테고리의 다른 글

Operating System Concepts_Chapter.1  (0) 2015.02.05
Operating Sysyem Concepts //컴퓨터 시스템의 구성  (0) 2015.02.03
정보보안개론 0x08  (0) 2015.01.24
정보보안개론 0x07  (0) 2015.01.23
정보보안개론 0x06  (0) 2015.01.23