보안/악성코드 분석

PE 헤더 분석 도구 (PEview, pestudio) 기능 및 사용법

Security Engineer 2024. 7. 23. 00:30

그림0 - PEview와 pestudio 실행 화면

악성코드 분석 이해

  • 악성코드 분석 = 바이너리 분석 = 컴파일된 파일들을 분석
  • 악성코드 분석을 위해 실행 파일의 구조를 알아야 한다.
  • 윈도우: EXE, DLL
  • 리눅스: ELF, 바이너리 파일

 

PE 란?

  • PE는 윈도우에서 사용하는 실행 파일(EXE), DLL 파일 등을 위한 파일 형식
  • PE 파일 포맷은 Portable Executable File Format의 약자로, 파일이 이식 가능한 다른 곳에 옮겨져도(Portable) 실행 가능하도록(Executable) 만든 포맷(Format)이다.

 

 

PEview 기능 및 사용법

그림1 - PEview 아이콘

그림1의 아이콘을 더블클릭하여 실행 후, 분석할 파일을 불러온다.

그림2 - PEview 실행

PEview 실행 시, 좌측에 4D 5A, 우측에 MZ 라는 문자열이 확인된다.

4D 5A는 ASCII 문자열(16진수)로 MZ를 의미하며, Signature 또는 매직 넘버라고 불린다.

MZ는 MS-DOS 개발자 Mark Zbikowski(마크 즈비코프스키)의 머리글자를 딴 것으로, DOS에서 .exe 실행 파일에 사용되는 파일 형식이다. (이 바이너리가 PE 파일인지 검사)

 

 

그림3 - MS-DOS Stub Program

MS-DOS Stub Program 탭은 해당 파일이 DOS 모드에서 실행 가능한지 여부를 확인할 수 있는 탭이다.

우측에 "This program cannot be run in DOS mode"라는 문자열을 볼 수 있으며, 도스 모드에서 이 파일이 실행되는 것을 막기 위한 것이다. (16비트 환경에서 실행되는 영역이며, 32비트 환경에선 실행되지 않는 영역)

MS-DOS 사용 시 윈도우 프로그램을 실행하려 한다면 저 메시지를 볼 수 있다. 현재는 대부분 32비트, 64비트 운영체제를 사용하므로 하위 호환성을 위해서 만든 메시지라고 보면 된다.

 

 

그림4 - 이미지 파일 헤더

그림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

그림5 - 바이러스 토탈 Creation Time 비교

바이러스 토탈에서 해당 파일 분석 시 History의 Creation Time에서 파일의 생성일자가 동일한 것을 확인할 수 있다.

그림4의 Characteristics는 파일 형식에 대한 정보로 볼 수 있다.

 

PEView로 파일 패킹 여부 확인 방법

그림6 - Virtual Size와 Size of Raw Data 비교

파일의 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 - 패킹된 파일 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 분석

그림8 - IAT 정보 확인

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 아이콘

그림9의 pestudio를 더블 클릭하여 실행한다.

그림10 -pestudio 실행

pestudio 실행 시 그림10과 같은 화면이 뜨며, 좌측 상단의 file - open file로 분석할 파일을 불러오거나, 드래그 앤 드랍으로 분석할 파일을 놓는다.

그림11 - pestudio 파일 분석 초기 화면

상단의 property를 보면 md5, sha1, sha256 등 해시값이 확인 가능하다.

파일의 첫번째 문자 MZ(매직넘버)도 확인이 가능하다.

signature에 Microsoft Visual C++ v6.0 로 해당 파일이 패킹되지 않은 파일임을 알 수 있다. 

file-type 및 CPU가 몇 비트인지 확인이 가능하며, 전체적인 파일의 정보를 대략적 파악할 수 있다.

 

 

 

그림12 - pestudio file-header

file-header 세션에는 machine을 보면 Intel이라 기재되어 있으며, 이는 intel 아키텍처를 지원하는 CPU 에서 실행이 가능한 것을 의미한다.

compiler-stamp 확인 시, Sun Dec 19 08:16:16 2010 - UTC 가 확인되며 이는 파일의 생성 시간 또는 컴파일 시간으로 유추할 수 있다.

 

 

그림13 - pestudio libraries 분석

그림13은 라이브러리 항목으로, 파일에서 사용하는 DLL 파일을 확인할 수 있다.

우측 확인 시 각 DLL 파일의 정보를 확인할 수 있다.

 

 

그림14 - pestudio imports 분석

그림14은 imports 테이블 부분으로, 어떤 윈도우 API 함수를 가져와 사용하여 파일이 어떤 기능을 가지고 있는지, DLL(동적 라이브러리)에서 파일이 사용하고자 하는 정보들이 기록되어 있다

윈도우 API 함수의 각 기능은 구글 검색 시 확인이 가능하며, 각각 어떤 동작을 하는지 파악 후 파일의 행위를 유추할 수 있다.

 

CreateFileA 
→ 파일 열기, 생성, 접근 대한 기능을 가지고 있다.

 

FindFirstFileA

특정 이름(와일드카드를 사용하는 경우 이름 일부)과 일치하는 이름을 가진 파일이나 하위 디렉토리를 디렉토리에서 검색한다.

 

FindNextFileA

FindFirstFile , FindFirstFileEx 또는 FindFirstFileTransacted 함수에 대한 이전 호출에서 파일 검색을 계속한다.

 

CopyFileA

→ 새 파일에 기존 파일을 복사한다.

 

위와 같이 API 함수의 기능을 파악한 후, 해당 파일이 어떤 행위를 할 것인지 유추한다.

 

 

그림15 - pestudio strings(문자열) 분석

그림15는 strings(문자열) 부분으로, Import Address Table 이 포함되어 있다. 

value 값을 참고하여 어떤 기능을 하고 있는지 분석이 가능하다. 

 

상단에는 어떤 DLL 파일을 사용하는지, 섹션 정보 등이 확인되며 하단에는 사용하는 윈도우 API 함수를 확인할 수 있다.

이는 파일 내 문자열 정보를 따로 추출한 것으로 문자열 추출 도구(BinText, strings)를 사용하여 추출한 정보와 유사한 정보로 볼 수 있다. 

 

 

 

결론

  • 정적 분석 도구를 사용하여 파일 내 문자열, DLL, API 함수를 파악한다.
  • 파악한 정보를 바탕으로 해당 파일의 행위를 유추한다.
  • 정적 분석은 파일의 행위를 유추하며, 동적 분석을 통해 파일을 동작시켜 유추한 행위를 증명한다.