일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 달고나bof
- c언어
- 밑바닥부터시작하는딥러닝
- 8086CPU레지스터
- C언어알고리즘
- 항등함수
- 딥러닝파이썬
- C알고리즘
- 정보보안
- FTZlevel10
- C언어 알고리즘
- 신경망구현
- BOJ
- 신경망
- 활성화함수파이썬
- 백준
- 파이썬
- 소프트맥스함수
- 파이썬신경망
- 버퍼오버플로우
- 백준알고리즘
- 머신러닝
- BOF
- 신경망 학습
- 신경망파이썬
- 알고리즘
- 스트림암호
- 보안
- 인공지능
- 딥러닝
- Today
- Total
HeeJ's
[03]악성코드분석_4주차 본문
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 |