2020/04/09 - [study/Malicious code basic, Reversing] - 악성코드 분석- 기초 정적 분석, PE 파일
이전 글을 참고해서 이번엔 메시지 창이 뜨는 코드를 직접 작성하고, 그 파일을 분석해보겠습니다.
#include <Windows.h>
void main() {
MessageBoxA(NULL, "test", "test", 0);
Sleep(300);
}
sleep함수가 포함되어있는 간단한 코드입니다.
만들어진 exe파일을 PEview로 열어봅시다.
왼쪽에는 PE파일에 대한 헤더, 오른쪽은 바이너리 파일에 대한 뷰를 볼 수 있습니다.
IMAGE_DOS_HEADER
visual studio에서 #include<winnt.h>를 입력한 뒤,
winnt.h에 마우스 우클릭, 문서보기를 통해 구조체를 확인할 수 있습니다.
눈여겨봐야하는 부분은 e_magic, e_lfanew부분입니다.
e_magic
5A 4D, signature부분이므로 PE파일임을 나타내는 5A 4D가 제일 처음부분에 나와있습니다.
e_lfanew
000000F0: IMAGE_NT_HEADER 시작주소.
실제 이 파일이 어디서 시작하는지 알려주는 부분입니다.
해당 주소로 가면, PE라고 써있는 것을 확인할 수 있습니다.
한번 더 시작지점을 알려주는 OFFSET역할을 해줍니다.
DOS Stub Program
value부분에서 읽히는 This is program cannot be run in DOS mode를 통해
이 파일은 윈도우에서 실행되는 파일임을 알려줍니다.
실행하지않아도 정적분석을 통해 윈도우에서 실행되는지, DOS에서 실행되는지 알 수 있습니다.
NT_HEADER
NT_HEADER 부분의 문서를 확인해봅시다.
위에서 이어졌던 시작점인 signature부분이 나옵니다.
50 45(PE)를 통해 PE파일임을 확인가능합니다.
문서에서도 이어지듯이 FILE_HEADER부분을 보겠습니다.
Machine(CPU)
014C- intel CPU라는 뜻입니다.
Number of Sections
말 그대로 섹션의 개수입니다.
Time Date Stamp
0x5E900E3C->10진수로 계산을 하면 1586499132입니다.
초를 기준으로 저장을 하기 때문에 변환을 하고 컴퓨터 pc에서 기준이 되는 날인 1970년 1월 1일 0시에 더해주면 됩니다.
->2020년 4월 10일 오전 6시 12분 12초
Pointer to Symbol Table, Number of Symbols를 지나
Size of Optional Header
0xE0(32bit), 0xF0(64bit), 0x00(obj)-> 이번에도 저는 32bit라고 확인이 됩니다.
Characteristics
파일 형식 정보에 관한 부분입니다. OR연산을 이용하기 때문에 각 필드의 정보를 보고 어떤 속성인지 알 수 있습니다.
PE뷰어에도 나와있지만 문서에서 다시 확인 가능합니다.
OPTIONAL_HEADER
값 | 이름 | 의미 |
0x10B | Magic | 32bit 구조체 |
0xE00 | Size of code | 코드 영역 크기는 0xE00 |
0x127E | Address of entry point | 파일 실행 시 Image Base + 0x127E 부터 시작 |
0x1000 | Base of code | 코드 영역이 Image Base+ 0x1000 부터 시작 |
0x400000 | Image Base | PE파일이 메모리에 로드되는 시작주소 |
0x1000 | Section Alignment | 섹션의 크기는 1000의 배수가 되고 빈 공간은 0으로 채움 |
0x200 | File Alignment | |
0x5000 | Size of Image | 파일이 로딩시 전체 크기 0x5000, File Alignment의 배수 |
0x400 | Size of Header | 헤더크기는 0x400 |
0x3 | Sub system | CUI |
0x10 | Number of RvaAndSize | Data Directory 구조체는 0x10개 |
SECTION_HEADER
Section Header의 종류
종류 | 용도 |
.text | 실행코드 |
.data | 초기화된 전역변수, static변수 |
.rdata | Const 변수, 문자열 상수 |
.bss | 전역변수, static변수, 문자열, 기타 상수 |
.edata | EAT와 관련된 정보 |
.idata | IAT와 관련된 정보 |
.rsrc | 리소스정보 |
값 | 멤버 | 의미 |
0x2E746578 | Name | 섹션이름, .text |
0xCCC | Virtual Size | 메모리 섹션 크기 정보 |
0x1000 | Virtual Address |
메모리 섹션의 시작 주소 Image Base 가 0x400000이므로 실제 주소는 0x401000이 됨. |
0xE00 | Size of Raw Data | 파일에서의 섹션 크기 |
0x400 | Pointer to Raw Data | 파일에서의 섹션의 시작 위치 |
0x60000020 | Characteristics | 읽고 쓰기가 가능한 코드 섹션 |
이렇게 코드를 작성하고 그 파일을 분석해 보았습니다.
'study > 악성코드분석&리버싱' 카테고리의 다른 글
기초 정적 분석, lab01-01.exe, lab01-01.dll 분석하기 (4) | 2020.04.16 |
---|---|
기초 정적 분석에 필요한 도구 (3) | 2020.04.16 |
악성코드 분석- 기초 정적 분석, PE 파일 (0) | 2020.04.09 |
Reversing Theory- abex' crackme #1 (2) | 2020.04.02 |
Reversing Theory- little endian (4) | 2020.04.02 |