ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • PE 파일(정리) -1
    Reversing 2019. 2. 10. 12:36

    (* 본 글은 리버싱 핵심원리와 다른 블로그들의 글들을 보고 대충 정리해본 것입니다.

    혹여 사실이 아닌 부분이 있다면 피드백 남겨주시면 감사하겠습니다.)



    PE 파일 : 윈도우 운영체제에서 사용되는 실행 파일 형식.

     - 기존 유닉스에서 사용되는 COFF를 기반으로 MS에서 만들었다.

     - PE(Portable Executable)의 뜻에 맞게 다른 운영체제에도 이식성을 좋게끔 하려는 의도였음

     (다만 실제로는 윈도우즈 계열의 운영체제에서만 사용됨.)

     - 기본적으로 32비트 형태의 실행 파일을 의미함. (PE32라는 용어를 사용하기도 함.)

     - 64비트 형태의 실행 파일은 PE64가 아닌 PE+ 혹은 PE32+라고 부른다.(PE 파일의 확장 형태)


    PE FIle Format


    종류 : 실행 계열, 드라이버 계열, 라이브러리 계열, 오브젝트 파일 계열

     실행 계열 : EXE, SCR

     드라이버 계열 : SYS, VXD

     라이브러리 계열 : DLL, OCX, CPL, DRV

     오브젝트 파일 계열 : OBJ


     (NULL Padding : PE 헤더, 각 섹션의 끝에 있는 영역.

     존재 이유 : 컴퓨터에서 파일, 메모리, 네트워크 패킷 등을 처리할 때 효율을 높이기 위해

     최소 기본 단위를 맞추게 해줌.

     섹션 시작의 메모리 주소가 00000010이고 PE 헤더의 끝이 00000008일 경우, 추가적으로 00000008만큼

     NULL로 채운다는 말인 것 같다. - 메모리는 16진수니까.. 애매한 설명인듯.)

     

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

     RVA : Relative Virtual Address, ImageBase(기준 위치)에서부터의 상대주소

     => VA = RVA + ImageBase

    (ex. VA가 8을 가리키고, ImageBase가 2를 가리킨다면 RVA는 6을 가리킬 것 - 단순히 이해를 돕기 위한 예시입니다.)


     * RVA가 자주 쓰이는 이유 : PE 파일(주로 DLL 파일)이 프로세스 가상 메모리에 로딩되는 순간, 이미 그 위치에

     다른 PE파일(DLL)이 로딩되어 있을 수 있음.

     그 과정에서 재배치(Relocation) 과정을 통해 비어있는 다른 위치에 로딩되어야 함. 근데 만약 이 위치가 모두 VA\

     일 경우, 정상적인 액세스가 일어나지 않으므로 원래 절대주소와 연결되어있는 다른 상대주소를 활용하는 것이다.)


    PE Header (주인장이 막힌 부분 - 뭔가 외울 게 많아 보인다. 막막했음)

     1. DOS Header(Microsoft에서 PE 파일을 만들 때 당시에 보편화돼있던 DOS 파일을 나중에도 쓸 수 있도록 만듬)

      -> 기존 DOS EXE Header를 확장시킨 IMAGE_DOS_HEADER 존재

      - 위치: PE 파일의 제일 앞 부분

      - 존재 이유: 약간 C의 #include <stdio.h> 와 같은 역할이라고 생각함. 처음부터 "이 파일은 무슨 파일이다"를

      소개하는 역할을 하기 때문이랄까

      중요한 멤버) e_magic, e_lfanew

      e_magic : DOS signature 4D5A(아스키코드값 MZ)

      e_lfanew : NT header의 옵셋 표시

    ( * 실습할 때에는 HxD로 메모장(notepad.exe)을 열어 보자)

    ( ** 이 때 HxD에서 4D5A를 제외한 나머지 값은 리틀 엔디언으로 해석해야 한다. 4D5A는 왜 리틀 엔디언이 아닐까?)

    ( *** 이런 조건들을 맞춰줘야 정상적으로 프로그램이 실행된다. 처음부터 정해져 있는 PE 파일의 특성이기 때문(?))

     

    2. DOS Stub(존재 여부 : 옵션, 크기 일정 X, 없어도 파일 실행 자체에는 문제가 없다. 왜 있을까?)

     - 위치 : IMAGE_DOS_HEADER 그 다음부터 NT Header 구조체 전까지.

     - DOS 환경에서 실행하거나, DOS용 디버거를 이용해서 실행하면 DOS Stub에 있는 코드를 실행시킬 수 있다.

     - 근데 진짜 왜 있는거지?? 아는 사람ㅠㅠㅠ


    3. NT Header


    부터는 PE 파일 - 2에서 계속하겠습니다

    'Reversing' 카테고리의 다른 글

    이쯤에서 쓰는 codeengn basic 이후의 공부 계획  (0) 2019.05.11
    PE 파일(정리) - 2  (0) 2019.02.11
Designed by Tistory.