악성코드 분석 이해
- 악성코드 분석 = 바이너리 분석 = 컴파일된 파일들을 분석
- 악성코드 분석을 위해 실행 파일의 구조를 알아야 한다.
- 윈도우: EXE, DLL
- 리눅스: ELF, 바이너리 파일
PE 란?
- PE는 윈도우에서 사용하는 실행 파일(EXE), DLL 파일 등을 위한 파일 형식
- PE 파일 포맷은 Portable Executable File Format의 약자로, 파일이 이식 가능한 다른 곳에 옮겨져도(Portable) 실행 가능하도록(Executable) 만든 포맷(Format)이다.
PEview 기능 및 사용법
그림1의 아이콘을 더블클릭하여 실행 후, 분석할 파일을 불러온다.
PEview 실행 시, 좌측에 4D 5A, 우측에 MZ 라는 문자열이 확인된다.
4D 5A는 ASCII 문자열(16진수)로 MZ를 의미하며, Signature 또는 매직 넘버라고 불린다.
MZ는 MS-DOS 개발자 Mark Zbikowski(마크 즈비코프스키)의 머리글자를 딴 것으로, DOS에서 .exe 실행 파일에 사용되는 파일 형식이다. (이 바이너리가 PE 파일인지 검사)
MS-DOS Stub Program 탭은 해당 파일이 DOS 모드에서 실행 가능한지 여부를 확인할 수 있는 탭이다.
우측에 "This program cannot be run in DOS mode"라는 문자열을 볼 수 있으며, 도스 모드에서 이 파일이 실행되는 것을 막기 위한 것이다. (16비트 환경에서 실행되는 영역이며, 32비트 환경에선 실행되지 않는 영역)
MS-DOS 사용 시 윈도우 프로그램을 실행하려 한다면 저 메시지를 볼 수 있다. 현재는 대부분 32비트, 64비트 운영체제를 사용하므로 하위 호환성을 위해서 만든 메시지라고 보면 된다.
그림4는 IMAGE_NT_HEADERS 탭의 IMAGE_FILE_HEADER 이다.Decription의 MACHINE을 보면IMAGE_FILE_MACHINE_I386 을 확인 할 수 있는데 이것은 해당 파일이 intel x86 아키텍처를 지원하는 CPU 에서 실행이 가능한 것을 의미한다.
Time Data Stamp는 해당 파일이 언제 생성 되었는지 확인할 수 있다. → 2010/12/19 16:16:19 UTC
바이러스 토탈에서 해당 파일 분석 시 History의 Creation Time에서 파일의 생성일자가 동일한 것을 확인할 수 있다.
그림4의 Characteristics는 파일 형식에 대한 정보로 볼 수 있다.
PEView로 파일 패킹 여부 확인 방법
파일의 Virtual Size와 Size of Raw Data 비교를 통해 파일의 패킹 여부를 확인할 수 있다.
Virtual Size가 Size of Raw Data보다 크기가 크다면 해당 파일은 패킹되었다고 판단할 수 있다.
Virtual Size와 Size of Raw Data가 유사하거나 같으면 패킹되지 않은 파일로 판단할 수 있다.
Virtual Size > Size of Raw Data → 패킹 O
Virual Size ≒ Size of Raw Data → 패킹 X
패킹 여부는 PEiD 또는 Exeinfo PE 도구를 사용하여 확인이 가능하다.
관련 글은 여기를 참고한다.
그림7은 패킹된 파일을 PEview로 확인한 것이다.
좌측에 SECTION 항목이 .text 나 .rdata가 아닌 UPX로 변경되어 있으며, Virual Size와 Size of Raw Data 비교 시 Virtual Size가 훨씬 큰 것을 확인할 수 있다.
이렇게 패킹된 파일의 경우 IMAGE_SECTION_HEADER 정보가 제대로 안나올수 있으므로, 언패킹 후 분석하는 것을 권장한다.
섹션(Sections)이란?
- PE 파일에서 섹션은 프로그램의 실제 내용을 담고 있는 블록
- PE가 가상 주소 공간에 로드된 후 섹션 내용이 참고되고 실행됨
< Section 의 종류 >
.text - 코드 섹션 → 프로그램을 실행하기 위한 코드를 담는 섹션
.data - 데이터 섹션 → 초기화된 전역 변수들을 담고 있는 읽고 쓰기가 가능한 섹션
.rdata - 읽기 전용 데이터 섹션 → 문자열 상수나 C++ 가상 함수 테이블 등을 배치
.reloc - 기준 재배치 섹션 → 실행 파일에 대한 기준 재배치 정보를 담고 있는 섹션
.edata - 내보내기(export)섹션 → 내보낼 함수에 대한 정보를 담고 있는 섹션
.idata - 가져오기(import)섹션 → 가져올 DLL과 그 함수 및 변수에 대한 정보를 담고 있는 섹션
.didat - 지연 로드 섹션 → 지연 로딩(Delay-Loading)을 위한 섹션
.tls - TLS 섹션 → thread 지시어와 함께 선언되는 스레드 지역 저장소(Thread Local Storage)를 위한 섹션
.rsrc - 리소스 섹션 → 대화상자, 아이콘, 커서, 버전 정보 등의 윈도우 PE 파일이 담고 있는 리소스 관련 데이터들이 배치
.debug - 디버깅 섹션 → 디버깅 정보를 포함
PEview로 SECTION 분석
IMPORT Address Table → 로드된 실제 함수 주소 목록
IMPORT Name Table → 임포트 함수 이름 주소 목록
IMPORT Hints/Names & DLL Names → 로드하는 임포트 함수 이름 목록
IMPORT Address Table(IAT) 에서 해당 파일이 사용하는 DLL 및 API 함수들을 확인할 수 있다.
DLL 및 API 함수의 기능은 구글에서 검색 시 확인이 가능하다.
주요 DLL은 다음과 같다.
- Kernel32.dll: 메모리, 파일, 하드웨어 접근과 조작(기본적인 dll 파일)
- MSVCRT.dll: C 프로그래밍 언어를 위한 런타임 라이브러리로, 기본적인 C 함수 및 입출력 기능을 제공
- Advapi32.dll: 서비스 관리자, 레지스트리 같은 추가 윈도우 핵심 컴포넌트
- User32.dll: 유저 인터페이스 (버튼, 스크롤바, 사용자 행위 제어, 반응 컴포넌트), GUI 관련
- Gdi32.dll: 그래픽 보기 및 조작
- Ntdll.dll: 윈도우 커널 인터페이스
- WS2_32.dll: 윈도우 소켓 네트워크(외부와 통신)
- Wininet.dll: FTP, HTTP, NTP와 같은 상위 수준 프로토콜 구현
pestudio 기능 및 사용법
pestudio는 정적 분석 도구로, strings, DLL, API 함수, 파일 생성 시간, 패킹 여부 등을 확인할 수 있는 도구이다.
그림9의 pestudio를 더블 클릭하여 실행한다.
pestudio 실행 시 그림10과 같은 화면이 뜨며, 좌측 상단의 file - open file로 분석할 파일을 불러오거나, 드래그 앤 드랍으로 분석할 파일을 놓는다.
상단의 property를 보면 md5, sha1, sha256 등 해시값이 확인 가능하다.
파일의 첫번째 문자 MZ(매직넘버)도 확인이 가능하다.
signature에 Microsoft Visual C++ v6.0 로 해당 파일이 패킹되지 않은 파일임을 알 수 있다.
file-type 및 CPU가 몇 비트인지 확인이 가능하며, 전체적인 파일의 정보를 대략적 파악할 수 있다.
file-header 세션에는 machine을 보면 Intel이라 기재되어 있으며, 이는 intel 아키텍처를 지원하는 CPU 에서 실행이 가능한 것을 의미한다.
compiler-stamp 확인 시, Sun Dec 19 08:16:16 2010 - UTC 가 확인되며 이는 파일의 생성 시간 또는 컴파일 시간으로 유추할 수 있다.
그림13은 라이브러리 항목으로, 파일에서 사용하는 DLL 파일을 확인할 수 있다.
우측 확인 시 각 DLL 파일의 정보를 확인할 수 있다.
그림14은 imports 테이블 부분으로, 어떤 윈도우 API 함수를 가져와 사용하여 파일이 어떤 기능을 가지고 있는지, DLL(동적 라이브러리)에서 파일이 사용하고자 하는 정보들이 기록되어 있다
윈도우 API 함수의 각 기능은 구글 검색 시 확인이 가능하며, 각각 어떤 동작을 하는지 파악 후 파일의 행위를 유추할 수 있다.
CreateFileA
→ 파일 열기, 생성, 접근 대한 기능을 가지고 있다.
FindFirstFileA
→ 특정 이름(와일드카드를 사용하는 경우 이름 일부)과 일치하는 이름을 가진 파일이나 하위 디렉토리를 디렉토리에서 검색한다.
FindNextFileA
→ FindFirstFile , FindFirstFileEx 또는 FindFirstFileTransacted 함수에 대한 이전 호출에서 파일 검색을 계속한다.
CopyFileA
→ 새 파일에 기존 파일을 복사한다.
위와 같이 API 함수의 기능을 파악한 후, 해당 파일이 어떤 행위를 할 것인지 유추한다.
그림15는 strings(문자열) 부분으로, Import Address Table 이 포함되어 있다.
value 값을 참고하여 어떤 기능을 하고 있는지 분석이 가능하다.
상단에는 어떤 DLL 파일을 사용하는지, 섹션 정보 등이 확인되며 하단에는 사용하는 윈도우 API 함수를 확인할 수 있다.
이는 파일 내 문자열 정보를 따로 추출한 것으로 문자열 추출 도구(BinText, strings)를 사용하여 추출한 정보와 유사한 정보로 볼 수 있다.
결론
- 정적 분석 도구를 사용하여 파일 내 문자열, DLL, API 함수를 파악한다.
- 파악한 정보를 바탕으로 해당 파일의 행위를 유추한다.
- 정적 분석은 파일의 행위를 유추하며, 동적 분석을 통해 파일을 동작시켜 유추한 행위를 증명한다.
'보안 > 악성코드 분석' 카테고리의 다른 글
악성코드 동적 분석 도구 기능 및 사용법 (Process Monitor, Process Explorer) (0) | 2024.07.26 |
---|---|
DLL 의존성 확인 도구 (Dependency Walker) & 리소스 확인 도구 (리소스 해커) 기능 및 사용법 (0) | 2024.07.24 |
악성코드 분석 시 파일 내 문자열 확인 도구 (BinText, Strings) 기능 및 사용법 (3) | 2024.07.22 |
정적 분석 도구 PEiD, Exeinfo PE 및 UPX 기능 및 사용법 (0) | 2024.07.21 |
Virustotal 기능 및 사용법 / 악성코드 기초 분석 (0) | 2024.07.20 |