'Reversing/PE File Format'에 해당되는 글 7건

  1. 2012.11.12 RVA & RAW
  2. 2012.11.11 PE File Format 0x06
  3. 2012.11.07 PE File Format 0x05
  4. 2012.10.31 PE File Format 0x04
Reversing/PE File Format2012. 11. 12. 17:39

RVA & RAW



0x01. RVA (Relative Virtual Address)


VA (Virtual Address)memory에 mapping된 절대 주소를 뜻합니다.

RVA는 이름 그대로 어느 기준(ImageBase)으로부터의 상대 주소를 뜻합니다.


VA와 RVA의 관계는 다음과 같습니다.

RVA + ImageBase = VA


PE header 내의 많은 정보들이 RVA 형태로 되어있습니다.

RVA를 사용하는 이유는 relocation 때문입니다.

Dll 같은 경우 memory에 mapping하려는 주소에 이미 다른 library가 있는 경우

Relocation을 통해 빈 공간에 mapping하게 됩니다.


0x02. RAW


RAWdisk상의 file에서 주소를 뜻합니다.

File상에서의 offset이라고도 부릅니다.


0x03. RVA to RAW


PE file이 memory에 load 될 때 RVA와 offset을 mapping할 수 있습니다.

RVA를 통해 offset을 구할 때 사용하는 비례식과 값들은 다음과 같습니다.


RAW - PointerToRawData = RVA - VirtualAddress

RAW = RVA - VirtualAddress + PointerToRawData


RAW : File 상에서의 offset

RVA : Memory 상에서의 RVA

VirtualAddress : Offset을 찾으려는 RVA가 속해있는 section의 RVA

PointerToRawData : Offset을 찾으려는 RVA가 속해있는 section의 offset


0x04. Practice


PEview를 이용해 직접 offset과 RVA를 변환 해 보겠습니다.

PEview로 열어볼 파일은 reversing 입문자 용 문제인 abex' crackme 1 입니다.


해당 프로그램에서 load 하는 dll중 하나인

KERNEL32.dll의 이름을 가리키고 있는 RVA를 offset으로 변환하겠습니다.


계산식을 하나씩 채워나가도록 하겠습니다.

RAW = RVA - VirtualAddress + PointerToRawData


RVA는 offset을 찾으려는 값을 넣으면 됩니다.

KERNEL32.dll의 RVA0x00003064 입니다.


RAW = 0x00003064 - VirtualAddress + PointerToRawData


VirtualAddress는 RVA가 속해있는 section의 RVA 입니다.

0x00003064는 .idata section에 속해있습니다.

.idata section의 RVA0x00003000 입니다.


RAW = 0x00003064 - 0x00003000 + PointerToRawData


PointerToRawData는 RVA가 속해있는 section의 offset 입니다.

.idata section의 offset0x00000A00 입니다.


RAW = 0x00003064 - 0x00003000 + 0x00000A00


계산하면 RAW0x00000A64 입니다.

Disk 상에서 0x00000A64를 찾아가봅니다.


KERNEL32.dll string이 있는 것을 확인할 수 있습니다.


'Reversing > PE File Format' 카테고리의 다른 글

PE File Format 0x06  (0) 2012.11.11
PE File Format 0x05  (0) 2012.11.07
PE File Format 0x04  (0) 2012.10.31
PE File Format 0x03  (0) 2012.10.29
PE File Format 0x02  (0) 2012.10.29
Posted by slimV
Reversing/PE File Format2012. 11. 11. 23:03

PE File Format 0x06



0x01. EAT (Export Address Table)


Windows에서 제공하는 WinNT.h의 _IMAGE_EXPORT_DIRECTORY 구조체입니다.


EAT는 library에서 제공하는 함수를 다른 프로그램에서 불러 쓸 수 있도록 해줍니다.

EAT를 통해 library가 export 하는 함수의 시작 주소를 구할 수 있습니다.

EAT는 PE header에서 Optional header의 Data directory[0]을 따라가면 찾을 수 있습니다.

EAT에서 중요한 부분을 하나씩 살펴보도록 하겠습니다.


NumberOfFunctions // 실제 export 함수의 개수를 나타냅니다.

NumberOfNames /* Export 함수 중에서 이름을 가지는 함수의 개수를 나타냅니다.

 NumberOfFunctions보다 작거나 같습니다. */

AddressOfFunctions /* Export 함수 주소 배열을 가리키고 있습니다.

  배열의 원소 개수는 NumberOfFunctions와 동일합니다. */

AddressOfNames /* 함수 이름 주소 배열을 가리키고 있습니다.

   배열의 원소 개수는 NumberOfFunctions와 동일합니다. */

AddressOfNameOrdinals /* Ordinal 주소 배열을 가리키고 있습니다.

   배열의 원소 개수는 NumberOfFunctions와 동일합니다. */


0x02. Get APIs' Address


EAT가 export 된 함수들을 가리키고 있는 것을 그림으로 나타낸 것입니다.


Export된 함수들의 각 정보를 가진 RVA list들을 가리키고 있는 것을 확인할 수 있습니다.


'Reversing > PE File Format' 카테고리의 다른 글

RVA & RAW  (0) 2012.11.12
PE File Format 0x05  (0) 2012.11.07
PE File Format 0x04  (0) 2012.10.31
PE File Format 0x03  (0) 2012.10.29
PE File Format 0x02  (0) 2012.10.29
Posted by slimV
Reversing/PE File Format2012. 11. 7. 01:12

PE File Format 0x05



0x01. IAT (Import Address Table)


Windows에서 제공하는 WinNT.h의 _IMAGE_IMPORT_DESCRIPTOR 구조체입니다.

   


IAT는 Process가 어떤 library에서 어떤 함수를 가져와 사용하는지에 대한 정보를 가지고 있습니다.

일반적으로는 여러개의 library를 import 하기 때문에

Library 개수만큼 위의 구조체가 배열로 저장되어 있습니다.

구조체 배열의 마지막은 null로 끝납니다.

IAT에서 중요한 부분은 OriginalFirstThunk, Name, FirstThunk 입니다.


OriginalFirstThunk /* INT(Import Name Table)의 주소를 가리키고 있습니다.

     상황에 따라 함수의 주소를 가리키기도 하고

     Ordinal 값으로 사용되기도 하고

     Forwarder로 사용되기도 합니다.

     저장된 주소는 RVA 형식입니다.

     INT의 각 원소는 IMAGE_IMPORT_BY_NAME 구조체 포인터입니다. */

Name /* Library의 이름 문자열의 주소를 가리키고 있습니다.

  저장된 주소는 RVA 형식입니다. */

FirstThunk /* IAT(Import Address Table)의 주소를 가리키고 있습니다.

    저장된 주소는 RVA 형식입니다. */


0x02. IAT Address Mapping


IAT가 어떤 식으로 입력이 되는지를 알아보도록 하겠습니다.


IID의 Name을 이용해 해당 library를 로드합니다.


IID의 OriginalFirstThunk를 이용해 INT의 주소를 얻습니다.

해당 INT에서 IMAGE_IMPORT_BY_NAME의 주소를 얻습니다.

IMAGE_IMPORT_BY_NAME의 Hint 또는 Name을 이용해 해당 함수의 주소를 얻습니다.


IID의 FirstThunk를 이용해 IAT의 주소를 얻습니다.

해당 IAT에 위의 과정에서 얻어온 함수의 주소를 입력합니다.


위의 과정을 INT가 null일 때까지 반복합니다.


'Reversing > PE File Format' 카테고리의 다른 글

RVA & RAW  (0) 2012.11.12
PE File Format 0x06  (0) 2012.11.11
PE File Format 0x04  (0) 2012.10.31
PE File Format 0x03  (0) 2012.10.29
PE File Format 0x02  (0) 2012.10.29
Posted by slimV
Reversing/PE File Format2012. 10. 31. 21:31

PE File Format 0x04



0x01. Section Header


Windows에서 제공하는 WinNT.h의 _IMAGE_SECTION_HEADER 구조체입니다.


비슷한 속성의 자료들끼리 서로 모아놓기 위한 공간이 section입니다.

각 section의 속성을 가지고 있는 것이 section header입니다.

중요한 부분만 하나씩 살펴보도록 하겠습니다.


Name /* Section의 이름을 가지고 있습니다.

  Name은 BYTE 배열이며 배열의 크기는 8로 고정되어 있습니다.

 

  Name에 대해서는 정해진 규칙이 없습니다.

  그러므로 어떠한 값이든 넣을 수 있으며 null로 비워놔도 괜찮습니다.

   해당 파일에서는 5개의 section name을 확인할 수 있습니다. */

VirtualSize // Memory에서 section의 크기를 나타냅니다.

VirtualAddress /* Memory에서 section의 시작 주소를 나타냅니다.

     IMAGE_OPTIONAL_HEADER32의 SectionAlignment에 맞게 결정됩니다. */

SizeOfRawData // 파일에서 section의 크기를 나타냅니다.

PointerToRawData /* 파일에서 section의 시작 위치를 나타냅니다.

     IMAGE_OPTIONAL_HEADER32의 FileAlignment에 맞게 결정됩니다. */

Characteristics /* Section의 속성을 나타냅니다.

각 값들이 bit-OR 형식으로 조합됩니다.

Windows에서 제공하는 WinNT.h의 characteristics 값들입니다. */


'Reversing > PE File Format' 카테고리의 다른 글

PE File Format 0x06  (0) 2012.11.11
PE File Format 0x05  (0) 2012.11.07
PE File Format 0x03  (0) 2012.10.29
PE File Format 0x02  (0) 2012.10.29
PE File Format 0x01  (1) 2012.10.28
Posted by slimV