no image
PE FILE Format 0x02
NT HeaderIMAGE_NT_HEADERStypedef struct _IMAGE_NT_HEADERS {DWORD Signature; //PE Signature 50450000 ("PE"00)...} IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;(*위의 구조체는 32bit용이며 64bit 용은 세번째 멤버가 IMAGE_NT_HEADERS64 입니다.) NT Header의 첫부분에는 "PE"라는 Signature가 나오며 이는 DOS Header에서의 "MZ"와 같이 필수적인 요소입니다. IMAGE_NT_HEADERS -IMAGE_FILE_HEADER //파일의 대략적인 속성을 나타내는 구조체typedef struct _IMAGE_FILE_HEADER {WORD Machine..
2015.01.09
no image
PE FILE Format 0x01
PE FILE의 구조PE HeaderDOS HeaderDOS stubNT headerSection headerPE Body코드데이터리소스 VA & RVAVA : 프로세스 가상 메모리의 절대주소RVA : ImageBase에서부터의 상대 주소를 말합니다.RVA + ImageBase = VA 파일에서는 offset 으로, 메모리에서는 VA(Virtual Address)로 위치를 표현합니다..PE Header의 끝부분과 각 Section들의 끝에는 NULL padding 영역이 존재한다. 컴퓨터는 파일, 메모리, 네트워크 패킷등을 처리할때 효율을 높이기 위해 최소 기본 단위 개념을 사용하는데 PE파일에도 같은 개념이 적용됩니다. PE HedaerDOS Headertypedef struct _IMAGE_DOS_H..
2015.01.08
no image
C언어의 const 선언이 과연 리버싱에서 또한 값을 변경못하게끔 만들수 있는가?
C언어의 const 선언이 과연 리버싱에서 또한 값을 변경못하게끔 만들수 있는가? //정말 쓸모 없는 호기심에서 시작된 이번 게시글 "C언어를 공부하는 도중 이름을 지니는 심볼릭 상수를 표현하는 방법에는 두가지가 있는데, 그 중 하나는 'const 키워드'를 사용하는 방법이고, 또 하나는 매크로를 이용하는 방법이다."라 써있으며, "변수 선언시 const 선언을 추가하면 상수를 만들수 있다고 한다.즉, const int MAX=100; //MAX는 상수! 따라서 값의 변경 불가!바로 여기서 나의 호기심을 자극하였다. 저 문장을 보는 순간 "그럼 값의 변경이 불가능하다는 것은 Olly로 들어가서 그 값을 바꾸는것이 안된다는 것인가? Visual Studio를 통한 컴파일#include #include ma..
2015.01.08

PE FILE Format 0x02

Kail-KM
|2015. 1. 9. 01:33

NT Header


IMAGE_NT_HEADERS


typedef struct _IMAGE_NT_HEADERS {

DWORD Signature;    //PE Signature

50450000 ("PE"00)

...} IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;

(*위의 구조체는 32bit용이며 64bit 용은 세번째 멤버가 IMAGE_NT_HEADERS64 입니다.)


NT Header의 첫부분에는 "PE"라는 Signature가 나오며 이는 DOS Header에서의 "MZ"와 같이 필수적인 요소입니다.






IMAGE_NT_HEADERS -IMAGE_FILE_HEADER         //파일의 대략적인 속성을 나타내는 구조체


typedef struct _IMAGE_FILE_HEADER {

WORD Machine;

WORD NumberOfSections;

...

WORD SizeOfOptionalHeader;

WORD Characteristics;

} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;


  • Machine

CPU별로 고유한 값을 나타냅니다.

  • NumberOfSections

PE Body에서와 같이 PE파일은 Code,Data,Resource 등이 각각의 섹션에 나뉘어 저장이 되는데 그         섹션의 수를 나타냅니다. (0보다 커야함)

  • SizeOfOptionalHeader

IMAGE_OPTIONAL_HEADER32구조체의 크기를 나태냅니다.

*Windows의 PE Loader은 IMAGE_OPTIONAL_HEADER의 SizeOfOptionalHeader를 보고  IMAGE_OPTIONAL_HEADER32구조체의 크기를 인식합니다.

  • Characteristics;

파일의 속성을 나타내는 값입니다.


//Notepad.exe 의   IMAGE_FILE_HEADER






IMAGE_NT_HEADERS - IMAGE_OPTIONAL_HEADERS32    //64bit PE파일의 경우 64 사용


  • Magic

32bit의 경우 10Bh, 64bit의 경우 20Bh를 나타냅니다.


  • AddressOfEntryPoint

EP의 RVA(Relative Virtual Address)값을 가지고 있습니다.


  • ImageBase

-PE파일이 로딩(매핑)되는 시작주소를 나타냅니다.

-EXE,DLL 파일은 user memory 영역인 0~7FFFFFFFh 범위에 위치하고 SYS 파일은 kernel memory영역인 80000000h~FFFFFFFFh범위에 위치합니다.

-개발도구들이 만들어내는 EXE파일의 값은 00400000h이고, DLL파일의 값은 010000000h을              보통 사용합니다.

-PE loader는 PE 파일을실행시키기 위해 프로세스를 생성하고 파일을 메모리에 로딩(매핑)시킨후 EIP레지스터 값을 ImageBase+AddressOfEntryPoint 값으로 세팅합니다.


  • SectionAlignment & FileAlignment

SectionAlignment은 메모리에서 섹션의 최소단위를 나타내고 파일에서 섹션의 최소단위를 나태내는것이 FileAlignment 이다.


  • SizeOfImage

PE파일이 메모리에 로딩되었을떄 가상 메모리에서 PE Image가 차지하는 크기를 나타내며 일반적으로 파일의 크기와 메모리에 로딩된 크기는 다릅니다.


  • SizeOfHeader

PE Header의 전체크기를 나타낸다.


  • Subsystem

-Driver File(*.sys)

-GUI File : Graphic User Interface

-CUI File : Console User Interface


  • NumberOfRvaAndSize

DataDirectory 배열의 수를 나타내며 PE loader는 이 값을 보고 배열의 크기를 인식합니다.


  • DataDirectory

IMAGE_DATA_DIRECTORY 구조체의 배열로, 각 항목마다 정의된 값을 가지게 됩니다.

//Notepad.exe 의  IMAGE_OPTIONAL_HEADERS32



**본 게시물은 http://www.reversecore.com 을 참고하여 복습용으로 옮겨 적거나 한 것이지 결코 제 머리에서 나온게 아님을 알려드립니다.  자세한건 Reversecore로 가시는게 더 좋습니다.



'Reversing > Theory' 카테고리의 다른 글

PE File Format 0x04  (0) 2015.01.13
IDA PRO 단축키  (0) 2015.01.13
PE FILE Format 0x03  (0) 2015.01.10
PE FILE Format 0x01  (0) 2015.01.08
C언어의 const 선언이 과연 리버싱에서 또한 값을 변경못하게끔 만들수 있는가?  (3) 2015.01.08

PE FILE Format 0x01

Kail-KM
|2015. 1. 8. 03:23

PE FILE의 구조


  • PE Header

DOS Header

DOS stub

NT header

Section header

  • PE Body

코드

데이터

리소스






VA & RVA


VA : 프로세스 가상 메모리의 절대주소

RVA : ImageBase에서부터의 상대 주소를 말합니다.

RVA + ImageBase = VA


  • 파일에서는 offset 으로, 메모리에서는 VA(Virtual Address)로 위치를 표현합니다..
  • PE Header의 끝부분과 각 Section들의 끝에는 NULL padding 영역이 존재한다. 컴퓨터는 파일, 메모리, 네트워크 패킷등을 처리할때 효율을 높이기 위해 최소 기본 단위 개념을 사용하는데 PE파일에도 같은 개념이 적용됩니다.


PE Hedaer


DOS Header


typedef struct _IMAGE_DOS_HEADER {

WORD e_magic; //DOS signature : 4D5A("MZ")

...

...

LONG e_lfanew; //offset to NT header

}

    • 모든 PE 파일은 시작부분에 "MZ"가 필수적으로 존재
    •  e_lfanew가 가리키는 위치에 NT header의 OffSet이 표시

*NT header의 offset을 나타내는 E0는 Little-endian 방식이기에 000000E0로 읽어야 합니다.



DOS stub


Dos Header의 밑에 존재하며 필수적이지 않은 존재로 지워도 지장이 없습니다.

(사람에 비유하면 손톱과 같은 존재)

*붉게 표시된 부분16Bit 어셈블리명령어이기에  32bit 윈도우즈에서는 명령어가 실행되지 않는다

(PE파일로 인식되기에 무시된다.)

하지만 실행시킬수 있는 방법이 있는데 바로

*DOS환경에서 실행,

*DOS용 디버거를 이용해 실행가능(DOS EXE파일로 인식되기에)


즉,notepad.exe는 32bit용 PE파일이지만, DOS 환경에서 실행할 경우에도 같은 문자열이 출력이 된다.

다시말해 DOS환경에서는 16bit DOS용 코드가,Windows환경에서는 32bit Windows코드가 각각 실행된다.


**본 게시물은 http://www.reversecore.com 을 참고하여 복습용으로 옮겨 적거나 한 것이지 결코 제 머리에서 나온게 아님을 알려드립니다.  자세한건 Reversecore로 가시는게 더 좋습니다.


'Reversing > Theory' 카테고리의 다른 글

PE File Format 0x04  (0) 2015.01.13
IDA PRO 단축키  (0) 2015.01.13
PE FILE Format 0x03  (0) 2015.01.10
PE FILE Format 0x02  (0) 2015.01.09
C언어의 const 선언이 과연 리버싱에서 또한 값을 변경못하게끔 만들수 있는가?  (3) 2015.01.08


 C언어의 const 선언이 과연 리버싱에서 또한 값을 변경못하게끔 만들수 있는가?                //정말 쓸모 없는 호기심에서 시작된 이번 게시글

 
"C언어를 공부하는 도중 이름을 지니는 심볼릭 상수를 표현하는 방법에는 두가지가 있는데, 그 중 하나는 'const 키워드'를 사용하는 방법이고, 또 하나는 매크로를 이용하는 방법이다."라 써있으며, "변수 선언시 const 선언을 추가하면 상수를 만들수 있다고 한다.

즉, const int MAX=100;   //MAX는 상수! 따라서 값의 변경 불가!

바로 여기서 나의 호기심을 자극하였다. 저 문장을 보는 순간 "그럼 값의 변경이 불가능하다는 것은 Olly로 들어가서 그 값을 바꾸는것이 안된다는 것인가?


Visual Studio를 통한 컴파일

#include <stdio.h>

#include <stdlib.h>


main()

{

 const int a=10;


 printf("%d\n", a);

 

 if (a == 10)

  printf("Fail..It is ten...\n");

 else

  printf("Good!! Not 10!!");


  //a의 값이 변경 가능한지 확인하기. 10이 아니면 성공문으로 간다.

  system("pause");

}

 OllyDebugger로 열기

위에서 만든 파일을 올리디버거를 통해 열고, 그 후 성공과 실패를 나누는 지점인 CMP 비교지점을 찾기위해 F8로 접근..접근..접근....접근......안티디버깅으로 인한 실패..ㄴ이임ㄴ오니

IsDebugPresent 2개를 발견하고 TEST EAX,EAX >> XOR EAX,EAX로 변경시키므로 적용안되게끔 변경. 그후 다시 찾는다.

비교문은 EBP-8에 저장된 값과, 0A를 비교하여 성공문과 실패문의 갈림길.

EBP-8에는 처음의 컴파일한 10(0A)의 값이 있었다. 덤프창으로 가서 Control+E를 통해 값을 변경 >> 0B >> ??되네



 



 결론

IsDebugPresent 와 Entry Point Alert 등의 밑의 경고문등 방해요소가 있었지만

Module 'ConsoleA' has entry point outside the code (as specified in the PE header). Maybe this file is self-extracting or self-modifying.

Please keep it in mind when setting breakpoint!

결국 나의 궁금증은 해결 >> 10(0A)를 11(0B)로 변경할수 있다.

const 선언은 값을 변경하는 벙법에 제한을 두지만 결국 리버싱으로는 풀수 있는것 같다.





'Reversing > Theory' 카테고리의 다른 글

PE File Format 0x04  (0) 2015.01.13
IDA PRO 단축키  (0) 2015.01.13
PE FILE Format 0x03  (0) 2015.01.10
PE FILE Format 0x02  (0) 2015.01.09
PE FILE Format 0x01  (0) 2015.01.08