본문 바로가기

study/악성코드분석&리버싱

악성코드 분석- 기초 정적 분석, PE파일(2)

728x90

2020/04/09 - [study/Malicious code basic, Reversing] - 악성코드 분석- 기초 정적 분석, PE 파일

 

악성코드 분석- 기초 정적 분석, PE 파일

윈도우에서 가장 많이 악성코드로 제작되어 배포되는 PE 파일에 대해 알아보겠습니다. PE(Portable Excutable)파일 - win32 기본 파일형식 - exe, scr, sys, dll ... PE파일의 실행과정은 다음과 같습니다. 1. PE..

hxxyxxn-1238.tistory.com

이전 글을 참고해서 이번엔 메시지 창이 뜨는 코드를 직접 작성하고, 그 파일을 분석해보겠습니다.

 

#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 읽고 쓰기가 가능한 코드 섹션

 

이렇게 코드를 작성하고 그 파일을 분석해 보았습니다.

728x90
반응형