윈도우에서 가장 많이 악성코드로 제작되어 배포되는 PE 파일에 대해 알아보겠습니다.
PE(Portable Excutable)파일
- win32 기본 파일형식
- exe, scr, sys, dll ...
PE파일의 실행과정은 다음과 같습니다.
1. PE파일 실행
2. 헤더 정보를 메모리에 매핑
3. 실제 프로그램 코드로 분기
PE파일을 분석하는 방법은 헥사 에디터를 통하면 되는데요,
이전 글에서 사용했던 PEview를 사용하면 더 쉽게 보실 수 있습니다.
컴퓨터에 다 있는 메모장! 을 활용해서 한번 분석해보겠습니다.
notepad.exe 를 PEviewer로 분석을 할 것입니다.
notepad.exe 의 위치는 C:\Windows\System32에 가시면 확인 가능합니다.
PEview로 notepad.exe를 열면 다음과 같은 화면이 나옵니다.
첫 화면에서 제일 눈에 띄는 부분은 표시해둔 부분 정도가 되겠습니다.
차차 알아가보도록 할게요.
이를 위해 notepad.exe의 PE구조를 살펴보겠습니다.
(열심히 그렸어요...)
pe파일의 실행영역은 .text부분입니다.
그렇게 큰 차이는 없지만 헤더가 끝나고 나서 실제 실행영역을 하게 되는 section부분에서의 차이가 나타나게 됩니다.
앞뒤부분의 padding영역이 길어지는 것이 보이시나요?
실행할때 메모리의 특정 영역에 할당을 하거나 하는 여러 동적인 행동을 하게 되기때문에,
각각에 대한 경계선을 확보하기 위해 padding영역이 늘어나게 됩니다.
file상태로 있을 때는, 내용이 차곡차곡 있는 것이 좋습니다.
그래야 사이즈도 크지않고, 내용의 정의도 쉽게 되기 때문입니다.
이것이 memory상으로 올라가게 되면
나중에 address를 매핑하게 되면서 각각의 주소에 접근을 하게 되는데요.
여기 text 영역의 주소가 원래 file부분에서는 00000400이었다가
메모리에서는 깔끔하게 01001000으로 간 것이 보입니다.
그 아래의 data, rsrc부분도 memory영역에서의 address가 깔끔하게 떨어진 주소로 되어있는 것을 보실 수 있습니다.
배수의 느낌이 나게! 조금더 편리하게 매핑이 가능하겠죠?
offset과 address의 차이- RVA, VA
VA(Virtual Address); 가상 메모리 주소
RVA(Relative Virtual Address); 가상 메모리 상대 주소.
VA= ImageBase(대부분 40000000)+ RVA
그럼 이제 진짜 PEview로 하나하나 보도록 하겠습니다.
IMAGE_DOS_HEADER
실제 가장 처음부터 나오는 내용들로 이루어져있습니다. 4자리씩 끊어서 코멘트를 달아놓았다고 생각하면 됩니다.
5A4D, Signature
- 맨 처음부분을 보면 4D 5A라고 되어있었는데, 이렇게 표시된 이유는 리틀엔디안 표기법을 사용하기 때문입니다.
- 헤더 파일을 보다보면 각각의 파일에 대한 정보를 확인 가능합니다.
화면에서 value부분이 첫 줄, signature부분을 제외하고는 공란으로 되어있습니다.
이 뜻은 저 부분을 제하고는 중요하지 않다는 말일수도 있고, 많이 세팅이 안되는 것이라고도 할 수 있습니다.
다시 원본을 보면,
앞부분에 MZ를 제하고는 의미있어보이는 글자는 없는 것을 확인할 수 있습니다.
IMAGE_DOS_HEADER부분의 많은 정보들을 우리가 다 어떻게 외우고 있겠습니까..
설명에 대해서는 윈도우32를 만든 회사, ms에 들어가서 win32를 생성하는 다양한 파일들 중 중요한 정보가 저장되는
헤더파일들을 살펴보시면 됩니다.
저희는 64비트를 사용하기 때문에 winnt.h 파일을 보시면 됩니다.
visual studio에서 #include<winnt.h>를 입력한 뒤,
winnt.h에 마우스 우클릭, 문서보기를 통해 구조체를 확인할 수 있습니다.
눈여겨봐야하는 부분은 e_magic, e_lfanew부분입니다.
e_magic
어떤 구조인지 알려주는 부분입니다.
우리의 메모장 파일에서 봤던 4D 5A(MZ)는 PE파일 구조를 나타내는 signature입니다.
기타 다른 파일들의 signature로는 50 4B(ZIP), 25 50 44 46(PDF), 89 50 4E 47(PNG)들이 있습니다.
e_lfanew
000000F0: IMAGE_NT_HEADER 시작주소.
실제 이 파일이 어디서 시작하는지 알려주는 부분입니다.
해당 주소로 가면, PE라고 써있는 것을 확인할 수 있습니다.
한번 더 시작지점을 알려주는 OFFSET역할을 해줍니다.
DOS Stub code
This is program cannot be run in DOS mode라고 읽히는 부분을 보면
이 파일은 윈도우에서 실행되는 파일임을 알려줍니다.
실행하지 않아도 정적분석을 통해 윈도우에서 실행되는지 DOS에서 실행되는 것인지 알 수가 있습니다.
NT_Header
이부분에 대한 설명도 문서에서 확인해보겠습니다.
signature
이 파일이 50 45(PE)파일인지 확인가능.
여기에 바로 이어서 file_header부분이 나옵니다.
리틀엔디안 표기법으로 인해 기존 파일에서는 순서를 바꿔서 보시면됩니다.
Machine(CPU)
014C- intel CPU라는 뜻입니다.
Number of Sections
말 그대로 섹션의 개수입니다.
Time Date Stamp
0x93B4E8FA->10진수로 계산을 하면 156633163892입니다.
초를 기준으로 저장을 하기 때문에 변환을 하고 컴퓨터 pc에서 기준이 되는 날인 1970년 1월 1일 0시에 더해주면 됩니다.
뷰어에서는 계산을 해서 알려주기 때문에 지금의 타임 데이타는
2048년 7월 11일 오후 7시 1분 14초 .. 미래를 향해 있습니다...
Pointer to Symbol Table, Number of Symbols를 지나
Size of Optional Header
0xE0(32bit), 0xF0(64bit), 0x00(obj)-> 저는 32bit라고 뜹니다.. 윈도우 XP가 아닌데 왜 32bit로 뜰까요...?
Characteristics
파일 형식 정보에 관한 부분입니다. OR연산을 이용하기 때문에 각 필드의 정보를 보고 어떤 속성인지 알 수 있습니다.
winnt.h문서에서 0002에 해당하는 부분과 0100에 해당하는 부분만 보면 되겠습니다.
executable형식이라는 것과, 32bit라는 것을 의미하는 것인가봅니다.
이 두개를 or연산하여 0102라고 되어있는 것입니다.
OPTIONAL_HEADER
이 헤더 부분에서 주의깊게 봐야하는 것은 3가지 입니다. magic, address of entry point, sub system.
제 파일에 나오는 부분과 함께 보겠습니다.
Magic
실행하는 PE파일의 구조체가 32bit(0x10B)인지, 64bit(0x20B)인지 알려주는 부분.
010B는 32bit에 해당하는 값이기 떄문에 32구조체임을 확인할 수 있습니다.
Size of Code
코드영역(.text)의 크기
0001FC00이 제 코드 영역의 크기 입니다.
Address of Entry Point ** 제일 중요!
프로그램 실제 시작주소 입니다.
이전 포스팅에서 보았던, ollydbg에서 처음 실행되는 주소가 이 부분이였습니다.
이게 악성코드 에서는 오용이 되기도 합니다.
악성코드를 특정 번지에 심어놓고, 그곳을 실행주소로 지정합니다. -> 악성코드 시작 지점으로 지정할 수 있음.
0001F8D0, 파일 실행시 Image Base(400000)+ 01F8D0 부터 시작합니다.
Base of code
코드 영역이 시작되는 상대 주소 (RVA)
00001000, 코드 영역이 Image Base(400000)+ 0100부터 시작합니다.
Image Base
PE파일이 메모리에 로드되는 시작 주소.
보통 exe(0x400000), DDL(0x10000000)번지로 설정.
Section Alignment
메모리에서 섹션의 최소 단위, 시작주소는 이 값의 배수
1000, 섹션의 크기는 1000의 배수가 되고 빈공간은 0으로 채우게 됩니다.
File Alignment
파일에서 섹션의 최소 단위, 시작주소는 이 값의 배수
0200
Size of Image
PE파일이 메모리에 로딩될 때 전체 크기
02B000, 파일이 로딩 시 전체크기 0x2B000, file alignment의 배수.
Size of header
모든 헤더의 크기
= 0400
Sub System
1(system driver), 2(GUI), 3(CUI)
2->GUI
Number of RvaAndSizes
Data Directory의 구조체 멤버 개수
이 부분에 대해서는 define된 값이 있으므로 참조해서 속성들을 볼 수 있습니다.
Data directory 구조체는 0x10개 입니다.
SECTION_HEADER
Section Header의 종류
종류 | 용도 |
.text | 실행코드 |
.data | 초기화된 전역변수, static변수 |
.rdata | Const 변수, 문자열 상수 |
.bss | 전역변수, static변수, 문자열, 기타 상수 |
.edata | EAT와 관련된 정보 |
.idata | IAT와 관련된 정보 |
.rsrc | 리소스정보 |
이중에서 대표적으로 .text부분을 보겠습니다.
Name
섹션 이름.
2E 74 65 78=> test 섹션임을 의미
Virtual size
메모리 섹션의 크기
1FB50
Virtual Address
메모리 섹션의 시작 주소, RVA
Image Base가 0x1이므로 실제주소는 0x1001이 된다.
optional header의 base of code값과 동일하다.
Size of Raw Data
파일에서의 섹션 크기 (File Alignment의 배수)
1FC00
Pointer to RAW Data
파일에서의 섹션의 시작 위치
0400
Characteristics
섹션의 정보 표시
OR연산으로 표시, 20000000(실행), 4000000(읽기), 20(코드)
60000020-> 읽고 쓰기가 가능한 코드 섹션임을 의미한다.
이렇게 PE파일의 구조를 메모장 exe를 통해 분석해보았습니다.
다음은 직접 코드를 작성해보고 그 exe파일을 분석해보도록 하겠습니다.
'study > 악성코드분석&리버싱' 카테고리의 다른 글
기초 정적 분석에 필요한 도구 (3) | 2020.04.16 |
---|---|
악성코드 분석- 기초 정적 분석, PE파일(2) (2) | 2020.04.10 |
Reversing Theory- abex' crackme #1 (2) | 2020.04.02 |
Reversing Theory- little endian (4) | 2020.04.02 |
Reversing Basic- helloworld.exe (2) | 2020.03.27 |