IT 기술이 발전하는 만큼, 그리고 다양한 보안 제품과 장비에서의 기술이 발전하는 만큼 악성코드에서 사용하는 기술 또한 정교해지고 복잡하게 발전하고 있다는 점은 이미 널리 알려진 사실이다. 특히 악성코드 제작자의 입장에서는 1차적으로 보안 장비/제품에서 탐지되지 않는 것이 매우 중요하므로 다양한 탐지 회피 기법을 적극적으로 도입하고 있다. 탐지 회피 기법의 대표적인 예로는 악성코드의 외형을 가급적 정상 파일과 비슷하게 유지하면서 악의적인 데이터를 파일 외부에서 바로 확인할 수 없도록 인코딩 등의 과정을 거쳐 은닉하는 방법이 있으며, 악성코드의 종류에 따라 매우 다양한 데이터 은닉 기법이 발견되고 있다.

이러한 은닉 기법 중에서 인코딩 된 데이터가 비트맵 이미지 (BMP) 형태로 위장된 형태의 악성코드에 대해서 소개할 예정이며, 다음과 같이 두 가지 유형에 대해서 총 2회에 걸쳐 설명한다.

[유형-1] 리소스 섹션에 비트맵 이미지 형태의 인코딩 된 데이터를 포함하는 악성코드

[유형-2] VisualBasic Form 내부에 비트맵 이미지 형태의 인코딩 된 데이터를 포함하는 악성코드

 

[0] 비트맵 이미지 (BMP)

해당 유형의 악성코드를 자세히 살펴보기 이전에 먼저 비트맵 이미지에 대해 기본적인 이해가 필요하다. 비트맵 (BITMAP) 이란 비트(BIT) 와 맵(MAP) 의 합성어로, 일련의 비트가 나열된 데이터의 집합을 의미한다. 비트는 컴퓨터에서 데이터를 표현하는 데 사용되는 최소의 단위이며 01로 구성된다. 비트맵으로는 단순한 데이터를 저장할 수도 있지만 이미지 데이터를 저장할 경우에는 비트맵 이미지로써 해석될 수 있다.

비트맵 이미지는 비트맵 헤더이미지 데이터로 구성되어 있다. 비트맵 헤더는 운영체제 또는 응용프로그램에서 비트맵 이미지를 제대로 해석하기 위해 필요한 정보로, 운영체제에 따라 일부 차이가 있으나 여기서는 Windows 기준으로 설명한다.

비트맵 이미지의 시작 부분에는 BitmapFileHeader BitmapInfoHeader 가 위치하고 있다. BitmapFileHeader "BM" 문자열로 시작하며, 비트맵 이미지의 전체 크기와 이미지 데이터가 시작되는 위치에 대한 정보를 포함된다. 바로 이어서 등장하는 BitmapInfoHeader 에는 이미지의 가로, 세로 크기와 사용되는 색상의 심도, 압축 사용 여부 등의 정보를 포함하고 있다. 실제 비트맵 이미지 파일에서 각 헤더와 이미지 데이터의 모습을 [그림1] 에 표시하였다.

[그림 1] 비트맵 이미지 구조

앞서 분류한 두 가지 유형의 악성코드에는 내부에 비트맵 이미지를 포함되어 있다고 소개했다. 그렇다면 해당 비트맵 이미지는 어떤 그림을 표현하고 있을까? 특이하게도 악성코드 내부의 이미지들은 아래 [그림 2]와 같이 사람이 보기에는 의미를 찾을 수 없는 형태로, 다양한 색의 점으로 가득 찬 모습이다. 이러한 형태의 비트맵 이미지를 본 문서에서는 '랜덤픽셀 이미지' 라고 지칭하며, 이제부터 각 유형의 악성코드와 랜덤픽셀 이미지에 대해 조금 더 자세히 살펴보겠다.

[그림 2] 악성코드 [유형-1] [유형-2] 내부의 랜덤픽셀 이미지

 

[1] 리소스 섹션에 비트맵 이미지 형태의 인코딩 된 데이터를 포함하는 악성코드

[유형-1]의 악성코드는 섹션의 개수, 진입점(EntryPoint) 부분 코드의 흐름 등 구조적으로 Visual Studio 로 컴파일 된 실행파일의 특징을 보인다. 4개의 섹션 중 리소스(.rsrc) 섹션에 다양한 리소스 엔트리를 포함하고 있는데, [그림 3] 에서 확인할 수 있듯 공통적인 특징으로 BITMAP 엔트리가 존재한다. BITMAP 엔트리는 실행파일 내부에서 사용하는 이미지 파일이 저장되는 곳으로, GUI 기반의 실행파일에서 흔하게 확인이 가능한 리소스이다.

[그림 3] 악성코드 유형-1 의 섹션 구조

[유형-1] 악성코드는 랜덤픽셀 이미지를 BITMAP 리소스 엔트리 내부에 포함하고 있다. 같은 유형의 악성코드일지라도 개별 파일간에 차이가 존재하여, BITMAP 리소스 엔트리 내부에 1개의 이미지만 포함하는 경우도 있고, 다수의 이미지를 포함하기도 한다. 주요한 특징은 [유형-1] 악성코드라면 BITMAP 리소스 엔트리 내에 랜덤픽셀 이미지가 반드시 1개는 존재한다는 점이다. [그림 4] 에 나타난 것과 같이 [샘플 1-1]BITMAP 리소스 엔트리 내에 2개의 비트맵 이미지를 포함하며, 그 중 두 번째 이미지가 랜덤픽셀 이미지이다. [샘플 1-2]의 경우는 총 3개 중 세 번째 이미지에, [샘플 1-3]은 내부에 1개의 랜덤픽셀 이미지만 존재한다.

[그림 4] 악성코드 [유형-1] 내부의 랜덤픽셀 이미지

그렇다면 악성코드가 내부에 이러한 랜덤픽셀 이미지를 포함하는 이유는 무엇일까? 비트맵 이미지로 해석되고 있는 이 이미지들은 사실은 악성코드가 실제 악성 행위를 수행하기 위해 2차로 만들어내는 또 다른 악성코드를 인코딩 한 데이터이다.

[샘플 1-1]의 코드 흐름을 따라가보며 확인해보겠다. 해당 샘플의 main 함수 내에 진입하면, 처음에는 의미 없는 코드가 일부 실행되다가 [그림 5] (1)과 같이 메모리를 할당 받는 코드가 등장한다. 그 이후 파일 본체에서 특정 위치를 참조하여(2) 해당 데이터를 할당 받은 메모리에 복사하는(3) 루틴이 존재한다.

[그림 5] 샘플 1-1 에서 랜덤픽셀 이미지를 참조하는 부분

복사되는 데이터의 위치를 실제 그림에서 확인해보면, [그림 4] 에 나타난 [샘플 1-1] 의 그림에서 아래쪽 부분의 분홍색 영역과 랜덤픽셀 이미지 영역의 경계 부분에 해당한다. , 분홍색의 바탕 그림 부분은 악성 데이터에 해당되지 않으며, 중간영역의 랜덤픽셀 이미지 부분만이 유효한 악성 데이터로서 사용된다. 사람이 보기에는 의미를 알 수 없는 랜덤픽셀 이미지 형태가 나타나는 이유는 해당 데이터가 본래 '그림'을 나타내기 위한 데이터가 아닌 인코딩 된 형태의 데이터이기 때문을 알 수 있다.

랜덤픽셀 이미지 영역에서부터 복사해온 데이터를 디코딩하는 방법은 악성코드의 종류별로 약간 차이가 있으나, [샘플 1-1] 의 경우 TEA (Tiny Encryption Algorithm) 를 통해 디코딩 하고 있다. [그림 6] 에 랜덤픽셀 이미지의 디코딩 전 후 내용과 TEA 코드 부분 일부를 포함하였다.

[그림 6] 랜덤픽셀 이미지 영역의 디코딩

이와 같이 내부에 디코딩 된 코드로부터 본격적인 악성행위가 발생하기 때문에, 외형상의 특징만으로 어떠한 악성행위를 하는 악성코드인지를 바로 판단하는 것은 어렵다. 본문에서 예제로 든 3가지 샘플 또한 서로 다른 기능의 악성코드로, [샘플 1-1][샘플 1-3]의 경우는 SageCrypt 랜섬웨어이며 [샘플 1-2]Matrix 랜섬웨어이다. 랜섬웨어 이외에도 Trojan 이나 Backdoor 등의 악성코드에서도 [유형-1]의 특징을 갖는 경우가 다수 발견되었다.

AhnLab V3 에서는 [유형-1] 의 샘플을 다음과 같은 진단명으로 진단한다.

-       HEUR/Ranpix.Gen

신고
Posted by disruption