악성코드 분석방법
- 초기 분석
- 동적 분석
- 정적 분석
- 자동화 분석
초기 분석이란?
수집된 악성코드를 맨 처음으로 분석하는 단계.
즉, 수집된 악성코드를 따로 실행하지 않고 외형을 보고 분석하는 단계를 뜻함
1. 안티바이러스 스캔
- 악성코드는 고유의 (HASH)값을 가지고 있기때문에, 해시값을 매칭하여 안티바이러스 엔진에서 악성코드 여부, 탐지명 등의 정보를 확인할 수 있다.
* HASH (해시) 값
: 임의의 길이를 가진 데이터를 입력으로 받아 고정된 길이의 값을 출력하는 해시 함수(Hash function)에 의해 생성된 값입니다. 해시값은 원본 데이터를 고유하게 나타내는 역할을 하며, 데이터 무결성 확인, 암호화, 데이터 검색 등 다양한 분야에서 사용
> 파일 해시값 확인
- WinMD5Free (https://www.winmd5.com/)
> 안티바이러스 스캔
- Virustotal (바이러스 토탈) (https://www.virustotal.com/gui/home/upload)
- Choose file을 통해 분석 대상 파일을 직접 업로드 / 해시값을 'SEARCH'에 입력하여 다음과 같이 결과 화면을 확인
- 멀웨어닷컴 (https://www.ctx.io/)
(안티바이러스 엔진 스캔 제공 x, 데이터베이스에 저장된 정보를 활용하여 키워드와 악성코드 확률을 점수로 제공)
2. 패킹 여부 확인
패킹 : 압축을 푸는 과정 없이 바로 프로그램을 실행할 수 있는 실행압축 기능
- 활용
> 안티바이러스 우회
> 파일 내부 코드와 리소스 등을 감추어 악성코드 분석을 어렵게 만들 수 있음
> 파일의 용량을 줄이기 위한 사용
패킹의 종류
- Compressor
> 파일의 크기(용량)을 줄여 배포를 쉽게 하거나 주로 악성코드 실행속도를 빠르게 하는 용도로 사용
> 대표적으로 UPX, FSG
- Protectors
> 실행파일을 보호하는 것이 목적인 패킹 방식
> 크기(용량)은 증가할 수 있으나 언패킹이 까다롭고 코드 분석 및 난독화를 어렵게 만듦
UPX(Ultimate Packer for executables)
: 여러 운영체제에서 수많은 파일 포맷을 지원하는 오픈 소스 실행 파일 압축 프로그램
- 악성코드에 주로 사용되는 패커 (악성코드의 용량을 줄여 배포를 쉽게 하는 목적으로 활용)
악성코드를 상세 분석하기 전, 분석 대상파일의 패킹 여부를 체크하여 언패킹(Unpacking)을 수행하면
악성코드를 분석할 때 보다 많은 정보를 확인 가능
* 패커(Packer)
: 패킹을 해주는 프로그램을 말한다.
* 언패킹(Unpacking)
: 패킹된 소스코드를 보기 위해 암호화나 압축을 푸는 행위를 말한다
> 분석대상 파일의 패킹 여부 확인 : Exeinfo PE (http://www.exeinfo.byethost18.com/?i=1)
[실습1]
(1) upx 패커 다운로드
(2) 패킹 여부를 확인하기 위해 notepad.exe파일을 Exeinfo PE 프로그램을 이용하여 확인하면
다음과 같이 'Not packed'라는 문구를 확 인할 수 있다.
(3) 명령 프롬프트 창(cmd)에 접근하여 cd 명령어를 통해 upx.exe가 설치된 경로로 이동
(4) UPX 명령어를 통해 notepad.exe 패킹 (upx notepad.exe)
패킹 성공시, backed 1 file이라는 문구와 함께 파일 사이즈가 줄어든 것을 확인 가능
* notepad.exe 파일은 upx.exe가 존재하는 폴더로 복사하여 진행
- 패킹이 완료된 notepad.exe를 Eexinfo PE를 통하여 확인해보면, 다음과 같 이 'UPX' 라는 문구를 확인해 볼 수 있다.
UPX 언패킹 : '-d' 옵션을 이용
언패킹에 성공하면 다음과 같이 Unpacked 1 file이라는 문구를 확인할 수 있다
3. 문자열 확인
문자열 확인 : 분석대상 파일 내부에 존재하는 string 값을 확인하는 것
문자열 확인을 수행하기 전, 위에서 언급했던 패킹 여부를 반드시 확인하고 진행해야 함.
- 대표적인 프로그램: Bintext (https://www.portablefreeware.com/index.php?id=2506)
- 'find' 기능을 이용하면 원하는 문자열을 검색 가능
* dll(Dynamic Link Library) 파일
: 동적 링크라고 하며 실행 파일에서 해당 라이브러리의 기능을 사용 시에만, 라이브러리 파일을 참조하여 특정 기능을 호출한다.
4. PE 구조 분석
PE(Portable Excutable) 파일이란
PE 포맷에 따라 윈도우 운영체제 상에서 실행할 수 있는 프로그램을 의미함
PE 파일의 헤더에는 실행파일은 실행하기 위한 각종정보(DLL, 실행위치, 메모리 적재 방법) 등이 기록되어 있음
PE 파일을 실행하게 되면, PE의 정보부터 읽어들여 바이너리를 메모리에 올리기 위한 데이터 설정 작업을 하게 됨
윈도우에서 실행 가능한 프로그램(PE 파일)을 떠올리면 가장 먼저 떠오르는 것은 .exe 확장자의 실행파일임
그러나 PE 파일의 종류는 아래 표와 같이 다양한 종류의 확장자로 존재함
PE 포맷
: 윈도우 로더가 실행 가능한 코드를 관리하는데 필요한 정보를 캡슐화한 데이터 구조체
PE 파일 구조를 분석하는 이유
- 파일이 실행되기 위한 모든 정보를 PE 구조 분석을 통해 확인 가능
- 분석 대상 파일이 사용하는 API 함수나 파일이 로딩되는 메모리 주소를 파악 가능
PE 파일 구조
DOS header ~ Section header : PE Header
나머지 Section : PE Body
각 Section마다 NULL값이 존재
-> 여러 가지 내부 연산 등 처리상의 효율성을 위해 특정 단위로 간격을 맞추며 빈 공간은 Null로 채우는 것
각 세션의 위치를 표시할 때는 파일(File)은 offset, 메모리에서는 절대주소로 위치를 표시하며 VA라고 표기
또한, PE Header에는 많은 정보들이 RVA 형태로 존재한다
► Offset, VA, RVA 개념
• Offset : 파일의 첫 바이트부터의 거리
• VA(Virtual Address) : 프로세스 가상 메모리의 절대 주소
• RVA(Relative Virtual Address) : 기준(ImageBase)으로부터의 상대주소 ,
• RVA + ImageBase = VA
PE Header에는 DOS header, Dos stub. Section header 등이 존재
PE Body에는 실제 세션들이 존재하는데, 유형별로 파일에 필요한 정보를 담고 있음
[실습2]
notepad.exe의 PE구조를 확인
- PEview 프로그램 설치 (http://wjradburn.com/software/)
- PEview.exe 실행 후 notepad.exe를 불러오기
- IMAGE_D〇S_HEADER부터 IMAGE_SECTI〇N_HEADER까지가 PE header값,
그 아래 7가지의 Section들이 PE Body를 이루고 있다는 것을 확인
PE 구조 데이터의 종류는 winnt.h 헤더파일을 통해 확인 가능
- MSDN 사이트를 통해서 확인하거나
- 마이크로소프트에서 제공하는 Visual studio를 설치하여 C언어 기반 소스파일을 생성하여 '#include<winnt.h>’ 입력 후 우클릭 -> 문서로 이동 'G'를 클릭하면 64bit 기반 PE파일 구조체를 한 눈에 살펴볼 수 있음
* MSDN : https://msdnrricrosoft. corr/ko-kr/library/windows/desktop/ms68C636(v=vs.85).aspx
(1) IMAGE_DOS_HEADER
IMAGE_DOS_HEADER에서 살펴봐야 할 데이터 - e_magic, e_lfanew
제일 처음 데이터를 살펴보면 'Signature'라는 데이터가 존재하는데, 파일의 시그니처 값을 담고 있음(e_magic)
매직코드나 헤더 시그니처라고 부르기도 하며 PE파일의 구조를 나타냄
대표적으로 실행파일(.exe)은 4D5A(MZ), 그림 파일(.jpg)은 FFD8 등으로 이루어짐
'5A4D'라는 값을 확인할 수 있는데, 이것은 리틀 엔디안 표기법을 사용하여 역순이기 때문에 '4D5A', 결론은 .exe 확장자 파일이라 는 것을 알 수 있음
e_lfanew: IMAGE_NT_HEADERS의 시작 주소를 저장하는 데이터
IMAGE_DOS_HEADER 값의 맨 아래 부분에서 확인 가능
-> 'IMAGE_NT_HEADERS'의 시작 주소는 '000000120'이라는 것을 알 수 있음
(2) MS-DOS Stub Program
MS-DOS Stub Program
: DOS 환경에서 실행되었을 때 실행할 내용을 저장하는 데이터를 의미
notepad.exe의 MS-DOS Stub Program 데이터를 보면 'This is program connot be run in DOS mode'라는 문구를 확인할 수 있음 -> 이는 이 프로그램(notepad.exe)이 도스 모드에서 실행될 수 없음을 의미
* DOS
: 검은 화면 위의 프롬프트라고 불리는 곳에 키보드로 명령어를 입력하는 흔히 원시적인 형태의 문자 입력 인터페이스(CLI)의 셸을 가진 운영체제
(3) IMAGE_NT_HEADERS
'IMAGE_NT_HEADERS'
위에 IMAGE_DOS_HEADER의 e_lfanew 에서 확인한 주소값과 같이 '00000120'로 시작하는 것을 확인 가
winnt.h 헤더파일에서 lIMAGE_NT_HEADERS' 데이터 정보 검색-> Signature, FileHeader, OptionalHeader 3가지 항목을 포함
| Signature, FileHeader, OptionalHeader가 포함하는 정보의 내용
notepad.exe의 Signature
-> 이 파일이 PE파일인지 확인 가능
- PE 파일의 헥사값은 '50 45'(PE) - 여기서도 리틀엔디안 기법의 '45 5O'(PE) 이라는 데이터값을 확인
음 IMAGE_FILE_HEADER는 파일의 개략적인 속성에 대한 데이터가 들어 있는데, 포함되어 있는 데이터는 아래 [그림 2-2이에서 볼 수 있듯이 7가지가 존재한다.
- Machine : 파일이 동작하는 CPU의 종류에 대한 넘버가 포함
notepad.exe의 머신값은 '86 64'로 (AMD64 (K8)'라는 것을 확인 할 수 있음. 즉 notepad.exe 파일은 AMD64 CPU와 호환성을 가짐
- Number of Section : 파일이 가진 섹션(Section)의 개수.
notepad.exe는 ‘0003’로 3개의 섹션을 포함하고 있다는 것을 확인
notepad.exe의 PE Body값을 보면, 실제로 총 3개의 Section을 포함하고 있음을 확인
- 'Pointer to Symbol Table'과 'Number of Symbols'
Pointer to Symbol Table(PTST) : COFF 심볼 파일의 오프셋의 값을 저장하는 데이터
Number of Symbols(NOS) : 심볼 테이블에 있는 엔트리 개수를 저장
COFF 심볼테이블은 이제 더이상 사용하지 않으므로 두 항목 모두 값은 항상 〇으로 설정되어야 함. notepad 또한 '00000000’값으로 설정되어 있는 것을 볼 수 있음.
* C0FF(Common Object File Format)
: 공동 개체 파일로 Windows NT 실행 파일 (이미지) 파일 및 개체 파일에 대한 특수 서식을 의미
- Size of Optional Header : Option Header의 크기를 저장하는 곳
운영 체제에 따라 차이 있음.
32Bit PE 파일- OxEO, 64Bit - OxFO, 오브젝트(OBJ) 파일 - 0x00
현재 분석중인 파일인 notepad.exe는 64bit PE 파일이므로 '00F0'이 저장 되어 있음을 볼 수 있음
- Characteristics : 현재 파일의 형식을 알 수 있는 데이터가 포함되어 있으며 이를 이용해 파일의 확장자를 파악 가능
Characteristics 안에 저장되어 있는 값는 Bit OR 연산을 수행하여 저장됨
notepad.exe의 Characteristics은 '00 22' 인데, 이는 0x0002와 0x0020를 Bit OR 연산한 값임. 즉, 실행이 가능하면서 (0x0002, File is executable) 64Bit의 운영체제를 사용(0x0020, App can handle〉2gb addresses) 한다는 것을 나타냄
〇PTIONAL一HEADER
: 파일 실행에 관한 중요한 정보들을 저장하는 영역으로 파일 실행에 있어 필수적인 값들
OPTIONAL.HEADER 데이터의 주요 내용
(4) SECTION HEADER
각각의 세션에 대한 정보를 포함하고 있기 때문에 파일 Section 수와 동일하게 구성
notepad의 파일 섹션(Section) 수는 3개 이므로 SECTION HEADER 수도 3개
| SECTION HEADER 구조체에서 알아야 할 중요 멤버
- Name의 '2E 74 65 78'이라는 값 >> ASCIIS 코드로 변환하면 .text, 즉 text 섹션임을 의미
- Virtual Size의 ‘00000230’라는 값 >> 메모리에서 해당 섹션이 차지하는 크기를 의미
- RVA : 메모리에서 해당 섹션의 시작 주소 .
- Size of Raw Data : 파일에서 .text 섹션이 차지하는 크기
- Pointer of Raw Data : 파일에서 .text 섹션의 시작 위치
PE Body의 경우 여러 Section들로 이루어져 있는데, Section 영역에는 실제 실행 코드와 데이터 혹은 리소스와 같은 여러 실제적인 정보들이 Section header에서 명시한 위치와 크기별로 포함되어 있음
'SWLUG > 악성코드' 카테고리의 다른 글
[악성코드] 예제로 배우는 악성코드 분석 - 동적분석(2) (6) | 2024.10.29 |
---|---|
[악성코드] 예제로 배우는 악성코드 분석 - 동적분석(1) (10) | 2024.10.01 |