관리 메뉴

HeeJ's

[03]악성코드분석_4주차 본문

<Information Security>/<Malware>

[03]악성코드분석_4주차

meow00 2021. 10. 6. 05:42

PE 파일

- 파일 포멧을 알아야 하는 이유

1. 프로세스 적재를 위한 정보

2. API 호출을 위한 IAT

3. 코드 사이즈와 각 섹션의 위치

4. 언패킹 (exe 파일들을 보호하는 패킹)

5. 바이러스 분석

6. 안티 디버깅

 

PE 파일 (=Portable Executable File Format)

: 파일이 이식 가능한 곳에 옮겨져도 (같은 OS 내에서)

실행 가능하도록

만든 포멧

 

- 윈도우에서 사용하는(운영체제 종속적) 실행파일, DLL 파일 등을 위한 파일 형식

- 윈도우 로더가 실행가능한 코드를 관리하는데 필요한 정보를 캡슐화한 데이터 구조체

- 링킹을 위한 동적 라이브러리 참조, API 익스포트와 임포트 테이블, 자원 관리 데이터 그리고 TLS 데이터를 포함

 

  

실행파일 컴파일 과정

Sourche.h --(Compile)--> Source.obj --(Link)--> Binary.exe

* .obj : 시스템에서 인식 가능한 오브젝트 파일(호환성X)

 

이 때, Binary.exe 앞에 PE Header가 붙는다.

PE Header 정보를 토대로 DLL을 로드, 메모리에 적재될 각종 리소스 할당

 

 

PE 파일 주요 구조

1. IMAGE_DOS_HEADER

PE의 가장 첫 번째 값

MZ 헤더를 통해 MS-DOS헤더의 시작을 알림

(4D 5A = MZ)

2. IMAGE_NT_HEADER

00 00 00 E0 -> IMAGE_NT_HEADER의 구조체 위치를 알림

시그니처

" 50 45 00 00 " (PE)

- 4바이트 바이러스에 자신의 시그니쳐를 심기도 한다.

- 지금은 안되지만, 바이러스나 악성코드 감염 표식용으로도 사용했다.

 

 

- 나머지는 두 개의 큰 구조체로 이루어짐

- FileHeader, OptionalHeader

 

1. IMAGE_FILE_HEADER

- WORD Machine; : 어떤 CPU에서 실행 가능한지 알림 (일반 데탑, 랩탑에서 사용할 경우 필요X)
- WORD NumberOfSections; : 이 파일이 가진 세션의 개수를 알림 (주로 .text, .rdata, .data, .rsrc 가 존재)

- DWORD TimeDateStamp; : obj -> EXE 파일을 만든 시간을 알림

- WORD SizeOfOptionalHeader; : IMAGE_OPTIONAL_HEADER32의 구조체 크기를 알림

- WORD Characteristics; : 이 파일이 어떤 형식인지 알림

 

2. IMAGE_OPTIONAL_HEADER

- WORD Magic; : 32bit -> 0x10B, 64bit -> 0x20B

- BYTE MajorLinkerVersion, BYTE MinorLinkerVersion; : 사용할 컴파일러 버전

- DWORD : SizeOfCode; : 코드 양의 전체 코드(악성코드는 이 값을 참고하여 자신의 코드를 복제할 위치의 기준을 잡는다.)

- DWORD AddressOfEntryPoint; : 파일이 메모리에서 시작되는 지점

DWORD BaseOfCode; : 실행 코드 위치(ImageBase와 BaseofCode를 더한 값부터 코드가 시작)

 

- DWORD ImageBase; : 로드할 가상 메모리 주소

- DWORD SectionAlignment;, DWORD FileAlignment; : 각 세션을 정렬하기 위한 정렬 단위 (기본 값: 0x1000)

- DWORD SizeOfImage; : EXE/DLL이 메모리에 로딩됐을 때 전체 크기

- DWORD SizeOfHeaders; : PE 헤더의 크기를 알림 (기본 값: 0x1000)

- IMAGE_DATA_DIRECTORY DataDirectory : VirtualAddress와 Size 필드 / Export, Import, Rsrc 디렉터리와 IAT 등의 가상 주소와 크기 정보

 

IMAGE_DATA_DIRECTORY의 Syntax

typedef struct _IMAGE_DATA_DIRECTORY {
	DWORD VirtualAddress; //The relative virtual address of the table.
    DWORD Size; //The size of the table, in bytes.
} IMAGE_DATA_DIRECTORY, *PRIMAGE_DATA_DIRECTORY;

 

섹션(Sections)

- PE 파일에서 프로그램의 실제 내용을 담고 있는 블록

- PE가 가상 주소 공간에 로드된 후 섹션 내용이 참고되고 실행

 

섹션의 종류

1. .txt (코드 섹션) : 프로그램을 실행하기 위한 코드를 담음

2. .data (데이터 섹션) : 초기화된 전역 변수들을 담고 있는 읽고 쓰기가 가능한 섹션

3. .rdata (읽기 전용 데이터 섹션) : 문자열 상수나 C++ 가상 함수 테이블 등을 배치 / 코드 상에 참조하는 읽기 전용 데이터도 이 섹션에 병합

4. .reloc (기준 재배치 섹션) : 실행 파일에 대한 기준 재배치 정보를 담고있는 섹션

5. .edata (내보내기 섹션) : 내보낼 함수에 대한 정보를 담고있는 섹션 / .rdata에 병합되기 때문에 DLL 내에서 별도의 세션이 존재하지 않음

6. .idata (가져오기 섹션) : 가져올 dll과 함수 및 변수에 대한 정보를 담고 있는 섹션 / IAT(Import Address Table) 존재 / .rdata에 병합

6. .didat (지연 로드 섹션) : 지연 로딩을 위한 세션

7. .tls (TLS 섹션) : _declspec(thread) 지시어와 함께 선언되는 스레드 지역 저장소(Thread Local Storage)를 위한 섹션

8. .rsrc (리소스 섹션) : 대화 상자, 아이콘, 커서, 버전 정보 등의 윈도우 PE 파일이 담고 있는 리소스 관련 데이터들이 배치

9. .debug (디버깅 섹션) : 디버깅 정보를 포함 / MS는 오래전부터 이 섹션에 디버깅 관련 기초 정보만을 담고, 실제 정보는 PDB 파일에 별도 보관

 

* IAT(Import Address Table) 호출 구조

IMPORT Address Table (로드된 실제 함수 주소 목록)

IMAGE_DEBUG_DIRECTORY
IMAGE_LOADCONFIG_DIRECTORY

IMAGE_DEBUG_TYPE_CODEVIEW

IMPORT Directory Table

IMPORT Nabe Table (임포트 함수 이름 주소 목록)

IMPORT Hints/Names & DLL Names (로드하는 임포트 함수 이름 목록)

 

패커란?

실행 파일 압축기

- PE 파일의 크기를 줄이고자 하는 목적

- PE 파일 내부 코드와 리소스(string, API) 등)를 감추기 위한, 디버깅을 못하도록 하기 위한 목적

ㄴ> 프로텍터

 

프로텍터

패킹 기술

리버싱을 막기 위한 다양한 기법 추가

원본 파일보다 크기가 커질 수 있음

 

패킹이 된다면

strings 와 code가 compressed & encrypted 되며, invisible 상태가 된다.

 

백신 우회 방법

1. 시그니처 변경

단순히 변수 몇 개를 추가하거나, 함수 위치를 변경하여 리빌딩

ex. a = b 등을 추가

 

2. 쓰레기 코드를 통한 우회 방법

ex)

inc ebx

dec ebx

&

push ebx

pop ebx

 

수행된 결과를 보면 아무것도 바뀌는 것이 없는 코드

 

3. 헤더 변조

해시 값도 변경이 됨

TimeDateStamp, Optional Header의 CheckSum, 메모리 속성 변조 등 값을 바꿔도 되는 Field들 존재

 

4. 대체 가능한 어셈블리어

ex

sub ebp, 7

= add ebp, -7

 

5. 실행조차 되지 않는 코드

 

'<Information Security> > <Malware>' 카테고리의 다른 글

[06]악성코드분석_7주차  (0) 2021.11.16
[05]악성코드분석_6주차  (0) 2021.11.10
[04]악성코드분석_5주차  (0) 2021.11.03
[02] 악성코드 분석_3주차  (0) 2021.09.29
[01] 악성코드 분석_2주차  (0) 2021.09.21