철민1234 2023. 7. 18. 21:26
728x90

• PE Format  정의

PE(Portalbe Executable)는 Winodws 운영체제에서 사용되는 실행파일 형식을 의미한다.

Windows 운영체제의 가장 핵심적인 부분은 Process, Memory, DLL 등이다.

 

PE의 종류

- 실행 파일 계열 : EXE, SCR 

- 라이브러리 계열 : DLL, OCX 

- 드라이버 계열 : SYS

- 오브젝트 파일 계열 : OBJ

 

• VA & RVA

VA(Virtual Address)는 프로세스 가상 메모리의 절대주소를 말한다.

RVA(Relative Virtual Address)는 어느 기준 위치(base address) 에서부터의 상대주소를 말한다.

VA와 RVA 관계는 RVA + base address = VA

 

• DOS Header

구조체에서 가장 주요한 멤버는 e_magic, e_Ifanew이다.

e_magic은 DOS의 시그니처(Signature)이며, 4 D5 A이고 ASCII 값으로 MZ이다.

e_lfanew은 NT header의 옵셋을 표시(파일에 따라 가변적인 값)한다.

 

• NT Header

D- Machine : CPU별로 고유한 값을 가지면서 IA-32 호환 CPU 14ch의 값을 IA-64 호환 CPU는 200h의 값을 가진다.

- Number of Sections : 이 값은 다음에 나오는 Section들의 개수이며 최소 1개 이상이어야 한다.

- Size of Optional Header : 이 값은 IMAGE_NT_HEADERS 구조체의 마지막 구조체 IMAGE_OPTIONAL_HEADER 32의 구조체 크기를 나타낸다.

- Characteristics : 이 값은 파일 속성에 대한 부분이다.

 

• IAT => DLL을 통한 링킹에 대한 메커니즘을 제공하는 역할

예전 16비트 시절에 DLL개념이 없고 Library만 존재했을 때는 함수 하나를 실행하고자 하면 라이브러리에서 binary 코드를 그대로 가져와서 실행 파일에 printf() 함수의 바이너리 코드를 삽입시켜 버렸다.

Widows OS로 넘어오면서 멀티태스킹 환경이 지원되었고, 여러 프로그램을 동시에 실행시키는 상황에서 프로그램마다 기본 라이브러리들과 프로그램을 위한 라이브러리들을 포함시키려니 중복으로 인한 메모리 낭비와 디스크 공간 낭비가 심해졌다. 그래서 탄생한 개념이 DLL이다.

DLL은 라이브러리를 프로그램에 포함시키지 않고 별도의 파일로 구성하여 필요할 때마다 불러 쓰는 식으로 사용이 된다.

=> 메모리에 한번 로딩된 DLL 코드, 리소스를 프로세스마다 공유시켜 메모리를 더 효율적으로 사용할 수 있다. 또한 라이브러리가 업데이트된다 하여도 해당 DLL파일만 교체하면 된다.

 

실습 -> PE View를 사용해 USER32.dll 실제 위치 찾기

설명

 

1.USER32.dll 위치를 알기 위해서는 PE Tool를 사용해 USER32.dll의 데이터 값을 찾는다.

 

2. USER32.dll 의 Data 값인 9792에서 RVA 값을 뺀 만큼 떨어져 있기 때문에 9792 - 8000을 해준다.

 

3. 1792 + Pointer to Raw Data 값인 6600을 더해주면 실제 데이터가 있는 위치를 찾을 수 있다.