PE 파일의 개요

악성코드 및 포렌식|2021. 3. 6. 16:31

 

 

1. PE 구조

 

 

 

 

 

안티디버깅와 언패킹이 가장 리버싱을 방어하는

 

exe를 실행을 할수는있지만 내부에서 방해하는 안티디버깅 기법

 

 

 

 

이식가능 한 이란뜻은 리눅스, mac 이런느낌이아니라window 에서 이식할떄 

실행가능한데 window xp->window7이런느낌으로 이식을하고 실행한다.

 

윈도우 로더는 운영체제에서 탑재된 것 

 

 

 

 

 

souurce.obj파일은 시스템이 인식가능 한것.

 

 

 

 

exeinfo, pestudio 최신

peview 는 눈에 잘보이게

prefram.py 코드를 눈으로 확인할수 있는 장점.

 

 

 

 

 

 

c:\windows\system32\notepad.exe를

peview로 실행시켜봤습니다.

 

 

 

 

처음에 나오는데 IMAGE_DOS_HEADER인데

 

DOS에서 실행가능하도록 호환성을 제공하기위한 헤더입니다.

 

MS도스의 시작을 알리는것입니다.

 

MZ 는 도스헤더라고 알려주는것.

 

PE파일인지 검사하려면 MZ인지 확인을 합니다.

 

LONG_e_lfanew; 이것이 가장중요한데

이게 pe헤더의 위치를 알려주는게 가장중요하다

 

 

위 hxd에 E0 00 00 00 4바이트로 존재를합니다.

 

 

00 00 00 E0 라고 읽습니다

E0 위치에 pe헤더가위치한다~~

 

 

 

실제로 노트패드에서도 이렇게 E0 00 00 00 라고되어있고

 

 

이것을 자세하게 보려면 왼쪽내용을 클릭하면됩니다.

 

 

 

 

클릭을하면 내부 세부내용이 보이고 

MZ라는 헤더가존재하고

 

000000E0 offset to New EXE Header는

 

새로운 EXE헤더가 어딨는지 알려줍니다

 

그래서 실제로 E0 를 따라가보면 pe가 존재를합니다 

 

 

그래서 들여다보려면 IMAGE_NT_HEADERS로 들어가면됩니다.

 

 

그리고

 

 

 

 

 

이중간에 있는 것은 DOS에서 실행할수 있는 코드 입니다 

 

DOS_HEADER를 읽고 애를 실행합니다

 

This program cannot be run in dosmode

 

이건 도스 모드에서 실행되는 것이 아니라고 말하고 종료될것이라고 추측이가능합니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

IMAGE_FILE_HEADE   File_Header와

 

IMAGE_OPTIONAL_HEADER OptionalHeader;를 살펴볼것입니다

 

 

 

 

 Machine 은 어떤 cpu에서 실행가능한지 알려줌

 

Numberfosections는 이파일이 가진 세션의 개수를 알려준다.(text,.rdata, .data , .rsrc)

 

 

TimeDateStamp 는 obj -> exe 파일을 만든 시간을 알림.

델파일로 만들어진 파일은 항상 1992년으로 표시

컴파일 시간을 알려준다)

 

 

 

 

 

 

 

========================================

optional _HEADER

 

 

 

 

32비트인지 64비트인지 알려준다

 

사용한 컴파일러 버전을 알려준다.

 

addressofentrypoint 

 

c에서 메인함수가 실행되고 다시 코드 섹션 어떤게 실행하려면 처음부터 실행하는게 아니라

파일이 메모리에서 시작된 지점 부터 시작됩니다 그래서

어디서부터 시작되는지 알수있습니다

 

 

 

 

BaseofCode;는

 

실행 코드의 위치가 어딨느냐 실행가능하고 중간에 실행하는건 알겟다

근데 이코드가 어딨는거냐  그 addressofentrypoint 의 위치를 파악을 하려면

baseofcode 를 보면됩니다.

 

 

 

 

baseofcode -> addressofentrypoint 이렇게 찾아가는 거면 됩니다.

 

 

 

 

 

보통은  0x401000 으로 하게되어있는데  xp에서만 그렇게되있고  aslr 이라  다른버전은 무작위로나오게됨.

 

 

노트패드는 100 에서시작한다.

 

 

 

 

time base

로드할 가상 메모리 주소

 

 

sectionalignment

filealignment;

각 세션을 정렬하기위한 정렬 단위

 

sizeofimage

exe/dll이 메모리에 로딩됐을때 전체크키

 

sizeofheaders

pe헤더의 크기를 알림(기본값 0x1000)

 

 

 

image_data_directory 

-virtualaddress(가상메모리)와 size 필드

- export,import,rsrc 디렉터리와 IAT 등의 가상 주소와 크기정보 

 

 

 

 

 

 

 

 

 

 

SYNTAX는 구문이라는 뜻

 

VirtualAddress 는 가상메모리의 주소

size는 메모리올라가는 사이즈

 

 

 

reserved 는 아직 사용되지 않는 것.

 

 

32bit 에서 64bit 로 주소체계가 바꼇으므로

이렇게 offset이 변화가된것입니다.

 

 

 

 

 

 

 

 

 

 

 

 

왼쪽이 구조체 

 

 

 

 

 

virtual size 가상메모리사이트

virt 가상메모리올라왔을때주소

 

메모리에대한 권한 올리디버거 memory map 으로 보면 다나온다.

 

MEM _~~~~~실행가능한 구역

읽기가능한 구역

쓰기가능한구역

 

 

 

 

 

 

==============================

 

 

 

 

API함수가 여러개 나온다.

 

 

API는

 

dll 에서 제공해주는 함수입니다.

윈도우를 다루게되면 윈도우에서 사용하는

 

 

 

 

 

c언어에서 pritf로 모니터에 hello월드라고 출력한다고 가정했을떄

이과정이 어떻게 되냐면

printf->

windows api를 호출을 한다.

-> dll 파일을 호출한다

-> kernel쪽으로 넘겨준다

-> 하드웨어 

윈도우에서 하드웨어를 총괄적으로  조정하는게 커널이기때문에

커널이 하드웨어에 넘겨준다 커널도 하드웨어도 일종의 프로토콜로 통신을합니다.

사용자가 헬로월드를 출력하길원하네 하고 출력이되는것입니다.

 

 

 

그래서 함수 주소를 볼수가 있습니다.

근데

주소는 바뀔수있다

 

윈도우버전이 업데이트되면 용량이커지고 dll이교체되고 바뀔수있어서

일종에 호환성을 제공하는 api를 c언어 사용하는 사람에게 제공한다.

 

 

주소를 매핑해주는게 import address table입니다

저 3개로 주소를 정한다고 생각하면됩니다

 

바뀔수있기때문에!!!

 

 

============================================

 

 

 

 

 

 

pe헤더 복구

 

 

 

 

 

 

pe header 가 오리지날 notepad.exe 와 헤더가 살짝다릅니다.

 

 

 

정상적인 파일은 mz 파일로 실행을 합니다. 

 

 

16 byte가 원본보다 크다는 것을 알 수 있습니다.

 

 

 

 

즉 한줄이 많은 것입니다.

 

 

peview에서는 수정하는 기능을 사용하지 않습니다.

 

 

 

 

그래서 hxd 프로그램에 notepad 1 을 올려서 이렇게 지웁니다 그리고 다른이름을 저장하면

 

notepad 가 제대로 열렸다!

 

 

 

 

 

 

 

'악성코드 및 포렌식' 카테고리의 다른 글

upx 언패킹, 레나 듀토리얼 21번  (0) 2021.03.06
패커  (0) 2021.03.06
올리디버거 레나 듀토리얼 -1  (0) 2021.03.06
올리디버거  (0) 2021.03.06
리버싱 기초 - c 문법과 어셈블리어  (0) 2021.03.06

댓글()