PE File Format


지금까지 오랜 시간에 걸쳐 PE(Portable Executable) File Format 에 대해 살펴보았습니다.

PE 스펙을 보면 각 구조체 멤버 하나하나 자세히 기술하고 있지만
리버싱에서 주목해야 하는 멤버들만 추려서 설명드렸습니다.

특히 IAT, EAT 에 관한 내용은 실행압축(Run-Time Packer), Anti-Debugging, DLL Injection, API Hooking
매우 다양한 중/고급 리버싱 주제들의 기반 지식이 됩니다.

hex editor 와 연필, 종이만 가지고 IAT/EAT 의 주소를 하나하나 계산해서
파일/메모리 에서 실제 주소를 찾는 훈련을 많이 해보시기 바랍니다.

쉽지 않은 내용이지만 그만큼 리버싱에서 중요한 위치를 차지하고 있기 때문에
고급 리버싱을 원하는 분들께서는 반드시 습득하셔야 합니다.



PEView.exe


간단하고 사용하기 편리한 PE Viewer 프로그램(PEView.exe)을 소개해 드립니다.
(개인이 만든 무료 공개 SW 입니다.)

http://www.magma.ca/~wjr/PEview.zip

아래는 PEView.exe 의 실행 화면입니다.


PE Header 를 각 구조체 별로 보기 쉽게 표현해주고, RVA <-> File Offset 변환을 간단히 수행해줍니다.
(제가 설명드렸던 내용과 용어 사용에 있어서 약간 틀릴 수 있습니다. 둘 다 익혀두시는게 의사소통에 좋습니다.)

위와 같은 PE Viewer 를 직접 제작해 보시는 것을 추천드립니다.
저 또한 처음 PE Header 를 공부할 때 (검증을 위해) 콘솔 기반의 PE Viewer 를 만들어서 지금까지 잘 사용하고 있습니다.
직접 제작하다 보면 자신이 잘 몰랐거나 잘 못 이해하던 부분을 정확히 파악하고 제대로 공부할 수 있습니다.



PE Patch


PE 스펙은 말 그대로 권장 스펙이기 때문에 각 구조체 내부에 보면 사용되지 않는 많은 멤버들이 많이 있습니다.

또한 말 그대로 스펙만 맞추면 PE 파일이 되기 때문에 일반적인 상식을 벗어나는 PE 파일을 만들어 낼 수 있습니다.

PE Patch 란 바로 그런 PE 파일을 말합니다.
PE 스펙에 어긋나지는 않지만 굉장히 창의적인(?) PE Header 를 가진 파일들입니다.
(정확히 표현하면 PE Header 를 이리저리 꼬아 놨다고 할 수 있습니다.)

PE Patch 만 해도 따로 고급 주제로 다뤄야 할 만큼 (리버싱에 있어서) 넓고도 깊은 분야입니다.

한가지만 소개해 드리겠습니다.
지금까지 배웠던 PE Header 에 대한 상식이 사뿐히 깨지는 경험을 하실 수 있습니다.
(그러나 PE 스펙에 벗어난건 없답니다.)

아래 사이트는 tiny pe 라고 가장 작은 크기의 PE 파일을 만드는 내용입니다.

http://blogs.securiteam.com/index.php/archives/675

411 byte 크기의 (정상적인) PE 파일을 만들어 냈습니다.
IMAGE_NT_HEADERS 구조체 크기만 해도 248 byte 라는걸 생각하면 이것은 매우 작은 크기의 PE 파일입니다.

다른 사람들이 계속 도전해서 304 byte 크기의 파일까지 나타나게 됩니다.

그리고 마지막으로 어떤 다른 사람이 위 사이트를 본 후 자극을 받아서
아래와 같이 극단적이고 매우 황당한 PE 파일을 만들어 내었습니다.

http://www.phreedom.org/solar/code/tinype/

이곳에 가면 Windows XP 에서 정상 실행되는 97 byte 짜리 PE 파일을 다운 받을 수 있습니다.
(2009년 4월 현재까지 최고 기록입니다.)
또한 PE Header 와 tiny pe 제작과정에 대한 내용을 자세히 설명하고 있어서 읽어보시면 크게 도움이 되실 겁니다.
(약간의 assembly 언어에 대한 지식이 요구됩니다.)

모두 다운 받아서 하나씩 분석해 보시기 바랍니다. 분명 크게 도움이 됩니다.



Epilogue


이러한 PE patch 파일들은 저뿐만 아니라 일반적인 리버서들의 고정관념을 깨트리는 내용이며
그래서 리버싱 공부가 더 즐겁습니다.

PE Header 에 대해서 다시 한번 강조 하고 싶은 내용은 아래와 같습니다.

- PE 스펙은 그저 스펙일 뿐이다. (만들어 놓고 사용되지 않는 내용이 많다.)
- 내가 지금 알고 있는 PE Header 에 대한 지식도 잘 못된 부분이 있을 수 있다.
   (tiny pe 외에도 PE header 를 조작하는 여러 창의적인 기법들이 계속 쏟아져 나온다.)
- 항상 모르는 부분을 체크해서 보강하자.

앞으로 제 블로그에서 다양한 형태의 PE 파일들을 분석할 예정입니다.
재밌고 특이한 PE Header 조작 기법에 대해서는 그때 그때 소개해 드리도록 하겠습니다.




저작자 표시 비영리 변경 금지
신고
  1. Ezbeat 2009.12.26 12:12 신고 댓글주소 | 수정 | 삭제 | 댓글

    오호... 97Byte짜리 PE파일... 신기하네요..

  2. hd5535 2010.01.22 18:04 신고 댓글주소 | 수정 | 삭제 | 댓글

    앗! PE뷰어 찾고 있었는데, 잘쓸게요^ㅡ^*
    PE 내용도 잘 읽어보고 갑니다

  3. straycat45 2010.01.27 03:10 신고 댓글주소 | 수정 | 삭제 | 댓글

    ^^* 우와~ ㅋㅋ
    파일 오프셋(RAW)구하는거랑, 임포트, 익스포트 함수가 이해 안돼서
    엄청 고생하고 있었는데, ㅠㅠㅋㅋ
    설명이 넘 잘돼있어요 ^^ㅋㅋ
    잘 보구 갑니다 !!

  4. Vi0 2010.08.04 22:45 신고 댓글주소 | 수정 | 삭제 | 댓글

    정말 이런블로그가 있다는것에 감사합니다 !
    설명이 너무 자세하게 잘나와있네요.
    웬만하면 댓글같은거 달지않는데
    질문도 올리고 이렇게 좋은 설명 받아먹으면서
    감사하단 말도 써놓지 않기엔 양심이 걸려서..
    정말로 감사드립니다 : )
    www.reversecore.com/2 부터 쭉 읽고있는데
    다 읽으면 제 리버싱에 엄청난 발전이 있을거같은 기대감이 ~.~

  5. 초보 2011.03.16 00:58 신고 댓글주소 | 수정 | 삭제 | 댓글

    PE에 대한 글을 읽고 궁금증이 생겼습니다.
    Relese로 만들어진 파일도 이렇게 분석이 가능한가요?
    Debug로 만들어진 파일만..?

    • reversecore 2011.03.16 21:33 신고 댓글주소 | 수정 | 삭제

      안녕하세요.

      Debug/Release 상관없이 전부 해석 가능합니다.
      두 버전의 차이는 주로 디버깅을 위한 추가적인 코드가 있느냐 없느냐의 차이입니다.

      감사합니다.

  6. 궁금한너구리 2011.07.17 03:39 신고 댓글주소 | 수정 | 삭제 | 댓글

    리버스코어님 강의 너무 좋습니다. (쵝오!!~^^b)
    이제야겨우 PE부분 다 봤네요.
    앞으로도 강의 열심히 습득하겠습니다.~ㅋㅋㅋㅋㅋㅋ

    아.. 그리고 하나 궁금한게 있는데요. 문뜩 떠오른건데
    notepad.exe 하고 보통 .txt로 저장된 파일하고, 아이콘모양은 같애보여도 다른파일이지요?
    예를들어 메모장에 문자열"AAAA"를 입력하고 저장한 파일은 메모장(notepad.exe)에 연결된
    파일이지만 실질적으로 "AAAA"문자열이 바이너리의 전부인거죠? 파일입출력하려는데 약간
    헷갈려서 질문합니다. ㅋㅋㅋ

    아!.. 또생각났는데요;; 만약 위에 AAAA 파일 바이너리가 AAAA뿐이라면 이 .txt파일의 제목은 어디다 저장하죠?

    • reversecore 2011.07.20 08:43 신고 댓글주소 | 수정 | 삭제

      안녕하세요.

      파일은 확장자 보다는 파일의 형식에 의해서 구분되는 것이죠. 다만 윈도우즈 기본 쉘인 탐색기에서 확장자를 보고 아이콘을 연결해 준 것이구요.

      파일이름은 파일시스템(NTFS, FAT32)에 저장됩니다. 파일에 저장되지 않습니다.

      감사합니다.

  7. Genesis 2012.03.08 01:59 신고 댓글주소 | 수정 | 삭제 | 댓글

    오늘 dll 인젝션 공부할려고 검색하다가 왔는데 API 후킹에, PE 까지 잘 배우고 갑니다^^

  8. taso 2012.07.05 06:55 신고 댓글주소 | 수정 | 삭제 | 댓글

    리버싱을 본격적으로 시작한지 별로 안되서
    아직, 배운 내용이 얼마나 활용될진 아직 예측도 못하겠지만,,
    계속 공부하다보면 감사하단 말 안써놓은게 후회될거같아서 이렇게 댓글남겨요 ㅋ
    좋은 내용 잘 배우고 갑니다.
    계속 공부 열심히할게요 ㅋ

  9. ace 2012.07.12 14:51 신고 댓글주소 | 수정 | 삭제 | 댓글

    정말 글 잘읽었습니다. 힘들게 공부하신거 이렇게 쉽게 가져가도 될까 싶을정도로 쉽게 잘 정리해놓으셨네요!! 자주 들러서 공부하겠습니다. 감사합니다~





티스토리 툴바