Malware Analysis 7

#7 PE - Rich 헤더

Abstract Rich 헤더는 PE 파일의 DOS 스텁 코드와 NT 헤더 사이 사용되지 않는 공간에 저장되는 데이터다. 실행에 영향을 주지 않으며 프로그램이 빌드된 환경에 대한 정보가 저장되기 때문에 사이버 위협 인텔리전스에서 활용되고 있다. 하지만 변조가 쉽기 때문에 신뢰하기보다는 참고용으로 사용하는 경우가 많다. 실제로 Rich 헤더를 변조해 다른 그룹의 악성코드로 위장한 경우도 있다. Rich Header 아래 그림에서 붉은 박스로 감싸진 영역이 Rich 헤더다. Rich 헤더 영역에서 푸른 박스로 감싸진 영역은 Rich 헤더의 시그니처, 초록색 박스로 감싸진 영역은 Rich 헤더의 체크섬이자 XOR 키이다. Rich 헤더의 데이터들은 Rich 헤더의 체크섬으로 XOR되어 저장된다. 단 Rich ..

Malware Analysis/PE 2021.08.01

#6 PE - .reloc 섹션

Abstract Windows는 보안을 위해 ASLR 기능을 지원한다. 물론 이외에도 DLL의 재배치 기능을 위해서 실행 파일을 가상 메모리 내 임의의 위치에 로드될 필요가 있다. .reloc 섹션은 이러한 재배치 기능을 위해 만들어진 섹션으로, OptionalHeader에 명시된 ImageBase가 아닌 다른 ImageBase에 PE 실행 파일이 로드될 때 참조 주소 값들을 새 ImageBase를 기준으로 다시 계산해 적용하기 위해 존재한다. .reloc Section .reloc .reloc 섹션은 PE 파일이 메모리에 로드될 때 Optional 헤더의 ImageBase 값이 아닌 다른 위치에 로드될 경우 문자열 주소나 IAT 영역 위치 등의 주소를 재배치된 ImageBase에 맞게 고치기 위한 섹션..

Malware Analysis/PE 2021.08.01

#5 PE - IAT

Abstract IAT는 PE 프로그램이 사용할 외부 라이브러리(DLL 등)의 파일명과 해당 외부 라이브러리에서 가져올 함수의 이름을 명시하는 영역이다. 파일에서의 IAT 영역은 외부 라이브러리 파일명과 함수의 이름을 가리키는 오프셋 값이 들어있지만, PE 로더에 의해 메모리로 로드된 후에는 외부 라이브러리의 가상 메모리 영역에 존재하는 함수의 시작 주소 값으로 변환된다. Import Address Table Overview IAT는 Import Address Table로 PE 파일이 사용하는 외부 API 함수의 주소들을 배열 형태로 저장해놓는 영역을 의미한다. IAT의 위치는 Optional 헤더의 DataDirectory 배열중 13번째 원소(DataDirectory[12])에 저장되어 있다. Dat..

Malware Analysis/PE 2021.08.01

#4 PE - Section Header

Abstract PE 포맷에서 Section이란 비슷한 데이터들을 모아놓은 공간을 의미한다. 주요 섹션으로는 실행 코드들이 저장되는 .text섹션과, 문자열 등이 저장되는 .data 섹션, 읽기만 가능한 데이터가 저장되는 .rdata 등이 있다. 각 섹션 헤더들은 섹션 데이터의 파일 내에서의 위치와 크기, 메모리에서의 위치와 크기를 명시하고 있으며, PE 로더는 이를 보고 각 섹션 데이터를 적절한 가상 메모리 영역에 로드한다. Section Header IMAGE_SECTION_HEADER structure 섹션은 비슷한 성질의 데이터들을 서로서로 모아놓은 것이다. 비유하자면 옷장에 반팔티, 반바지, 긴팔, 긴바지, 외투 등을 서로 다른 칸에 넣어둔 것과 비슷하다. 이렇게 되면 반바지만 모아놓은 칸은 반..

Malware Analysis/PE 2021.08.01

#3 PE - Optional Header

Abstract PE 포맷의 OptionalHeader에는 프로그램 실행의 시작 지점인 Entry Point를 비롯해 다양한 부가 정보를 가진다. Optional Header IMAGE_OPTIONAL_HEADER structure Optional 헤더는 PE 파일이 메모리에 올라갈 위치인 Image Base와 IAT 등의 위치를 기록한 Data Direcotry 등이 있다. 32비트 프로그램에서 winnt.h에 정의된 Optional 헤더는 아래와 같다. // // Optional header format. // typedef struct _IMAGE_OPTIONAL_HEADER { // // Standard fields. // WORD Magic; BYTE MajorLinkerVersion; BYTE..

Malware Analysis/PE 2021.08.01

#2 PE - File Header

Abstract PE 포맷의 DOS 헤더의 e_lfanew 멤버가 File Header의 위치를 가리킨다. File Header에는 PE 파일이 실행될 수 있는 머신(32/64 비트) 종류를 포함해 OptionalHeader의 크기, 섹션 개수, PE 파일 속성 등을 포함한다. File Header IMAGE_FILE_HEADER structure PE 헤더에서 File 헤더는 파일의 개략적인 속성을 나타낸다. PE32 파일인지 PE32+(64비트 프로그램)인지도 File 헤더를 통해 알 수 있다. File 헤더는 DOS 헤더가 e_lfanew 멤버를 통해 가리키던 NT 헤더의 멤버로 포함되어 있다. winnt.h를 통해 IMAGE_NT_HEADERS 구조체를 살펴보면 아래와 같다. typedef str..

Malware Analysis/PE 2021.08.01

#1 PE - DOS Header

Abstract PE는 Windows에서 사용하는 실행 파일 포맷이다. 실행 파일을 실행하기 위한 다양한 속성 값을 가지고 있어, 리버스 엔지니어링에 있어서 잘 알아둬야 할 파일 구조이다. 본 PE 편에서는 아래 항목들에 대해 서술하고자 한다. DOS Header File Header Optional Header Section Header IAT .reloc Section Rich Header DOS Header IMAGE_DOS_HEADER structure PE 파일의 DOS 헤더는 DOS 파일에 대한 하위 호환성을 고려해 만들어졌다. 때문에 PE 헤더의 가장 앞 부분에는 IMAGE_DOS_HEADER 구조체가 나타난다. IMAGE_DOS_HEADER는 'MZ' 라는 매직넘버로 시작하며 NT 헤더의 ..

Malware Analysis/PE 2021.07.31