ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • PE 구조 (2) - PE의 기본 구조
    Knowledge/Reversing 2019. 5. 16. 00:59

     

    안녕하세요 오늘은 PE 구조 두번째 포스팅인 PE의 기본 구조에 대해서 알아보려고 합니다.

    https://shineild-security.tistory.com/4

     

    PE 구조 (1) - (Portable Executable)PE의 종류

    안녕하세요. 오늘은 PE란 무엇인지에 대해서 포스팅하겠습니다. PE(Portable Executable) File이란 윈도우os에서 사용하는 실행 파일 형식을 말합니다. 64bit os가 생긴 현재 PE는 PE32(x86)와 PE+(x64)로 나뉘며..

    shineild-security.tistory.com

     

    일반적인 응용프로그램 같은 PE 파일들의 구조를 확인하기 위해서는 디버깅이 가능한 툴을 이용합니다.

    간단한 확인을 위해서, 그리고 처음 공부를 위해서는 헥스에디터 만큼 좋은 툴도 없는 것 같습니다.

     

    PE구조를 자동으로 분석해서 시각적으로 보여주는 도구들이 많지만 처음 접할 때는 역시 원본을 보고 공부하는 것이 우선이지 않을까 생각이 드는 필자입니다.

     

     

    이번 글에서는 가장 만만한 notepad(x84).exe로 PE의 기본적인 구조에 대해서 알아보겠습니다.

     

     

    (포스팅 관련 사진들은 xp x84에서 진행하였습니다.)

     

    프로그램은 기본적으로 컴퓨터가 읽을 수 있게 기계어로 구성되어 있으며 이 툴을 이용해서 보기쉽게(?) 16진수로 이 프로그램 구성을 보여줍니다.

    좌측 측면에는 Offset으로 ,오브젝트 내의 오프셋(offset)은 일반적으로 동일 오브젝트 안에서 오브젝트 처음부터 주어진 요소나 지점까지의 변위차를 나타내는 정수입니다.

    간단히 말하자면 상대적 주소 정도가 되겠네요.

     

     

     

    (주의 : 여기서 적은 헤더 및 구성들의 주소범위는 상대적인 것으로 notepad로 한정한 범위 표기라는 것을 알고 읽어주시면 감사하겠습니다. )

     

     

    HxD에 넣어서 본 notepad.exe

     

     

    PE는 window용 프로그램들의 일관성을 위해서 정해진 구조로 되어있습니다.

    사진에 나온 것과 같이 offset 000 ~ 3FF 까지는 PE Header에 관한 내용들이 구성되어 있으며 이 헤더 안에는 이 프로그램에 대한 각종 요약 정보들이 들어가 있다고 생각하시면 편할 것입니다.

    컴퓨터가 이 프로그램을 읽어드릴때 이 프로그램은 어떠한 어떠한 구성이라는 것을 미리 알려주는 부분으로 우리가 책을 읽을 때 목차가 있듯이 PE Header는 우리가 들여다 보아도 이 파일의 정보들을 얻을 수가 있습니다.

     

    그 후 offset 400 ~ 끝까지 PE Body로 구성되어 있다고 보시면 됩니다.

    PE body는 글 후반부에 언급하도록하고 PE 헤더에 대해서 조금만 더 알아보도록 하겠습니다.

     

    PE header에는 이 프로그램이 메모리에 어떻게 적재가 될 것인지, 여기서 쓰이는 DLL은 어떠한 종류가 있는지 메모르 크기는 어느정도인지 적혀있는 부분으로 PE 헤더 내부에서도 또 구조가 나뉘게 됩니다.

     

     

    PE header의 구조는 크게 DOS header, DOS stub, NT header, Section header 등으로 나뉘며 첫째로 DOS header부터 보도록 하겠습니다.

     

     

     

    Dos Header : offset 00 ~ 3F

     

    Dos header란 이 프로그램을 dos환경에서 실행 할 시 어떻게 실행되는가에 대한 내용이 정의된 부분으로 dos 헤더에는 dos파일 실행시 어떤 파일로 실행되는가를 정의해 두었습니다.

    00~ 01을 보면 4D 5A로 아스키코드 MZ가 적혀있는 것을 볼 수가 있습니다.

    여기서 'MZ'란 도스 실행파일을 뜻합니다.

    dos header에 더 상세한 내용은 추후 dos stub과 묶어서 또 하나의 글로 작성 할 예정입니다.

     

     

     

    DOS stub : 40 ~ DF

     

    DOS header가 끝이나면 40부터는 DOS stub이 시작됩니다.

    DOS stub은 40 ~ DF에 적혀잇으며  40 ~ 4D에는 16비트의 어셈블 명령어가 적혀있습니다.

    하지만 그 이후의 내용을 읽어보면 This program cannot be run in DOS mode라고 아스키 코드로 적혀있는 것을 확인할 수가 있습니다.

    아무리 구조를 잘 모른다해도 어떠한 의미인지 직관적인 확인이 가능하네요.

     

    NT Header 0E0 ~ 1D8

    NT header의 시작은 image_nt_headers의 시그니쳐 값인 5045(PE)로 확인 할 수 있습니다.

    NT header에는 여러가지 구조체들이 정의되어 있습니다.

    이 헤더에 대해서는 추후에 글을 작성하도록 하겠습니다.

     

    NT header가 끝난 후에는 PE header의 마지막으로 section header가 위치해 있습니다.

     

     

    난잡한 색깔들의 상자표시 보소;;

     

    섹션 헤더는 text, data, rsrc 의 바디 부분을 참고하기 위한 헤더부분으로 다음 글에서 설명하도록 하겠습니다.

     

     

    이렇게 섹션헤더까지 끝나게 되면 PE Body인 섹션들이 나옵니다.

     

     

     

     

    PE body는 세션 헤더에서 본 것과 같이 text, data, rsrc로 구성이 되어있습니다.

    이 부분도 나중에 좀 더 자세히 알아보도록 하고 오늘 포스팅에서는 간단히 보고 넘어가도록 하겟습니다.

     

     

    그리고 이 섹션들 사이에는 널값이 존재하는데 이 널은 각 세션들의 크기 규격을 맞추어 주기 위해서 존재합니다.

     

     

     

    오늘은 이렇게 PE의 구조에 대해서 간단한 구성을 알아보았습니다.

     

    이번 포스팅에 사용된 것은 notepad.exe(x84)로 각각 헤더들에 대한 offset값은 프로그램 마다 유동적으로 변하며

    각 구조들의 상세한 구조체들을 통해서 구분할 수가 있습니다.

    다음 글에서는 notepad가 아닌 calc를 통해서 해보려고 합니다.

     

     

    notepad를 서적들을 참고해서 포스팅하였는데 꽤나 대중적으로 나와있는 듯하여 필자의 학습에도 도움이 될듯 싶어서 calc을 직접 분석해서 포스팅 자료 사진으로 사용할 예정입니다.

    댓글

Designed by Tistory.