리버싱 입문

[리버싱 입문](2)[PE파일]

황올뱀 2025. 2. 4. 19:03

PE파일 더 알아보기

  • PE파일 만들어지는 과정: 고급 언어 -> 컴파일러 -> 기계어(PE 구조)
  • PE파일의 종류: 실행계열(EXE, SCR), 라이브러리계열(DLL, OCX, XPL, DRV), 드라이버계열(SYS, VXD), 오브젝트파일계열(DBJ)

PE파일의 구조

  • PE헤더: PE파일의 전체적인 정보를 담은 부분
    • MS-DOS헤더
      • IMAGE_DOS_HEADER: 가장 시작 부분에 위치, 기본적인 오류 메시지 출력, PE헤더의 위치 가리킴
      • MS-DOS Stub Program: 오류 메시지 저장 및 출력
      • IMAGE_NT_HEADERS: PE파일이 어떻게 로드되고 실행될 지 저장 (메타데이터 저장), 구조체로 정의됨
        signature: 0x00004550 상수 (아스키로 PE)
        IMAGE_FILE_HEADER: PE파일의 구조, 특성 표시 (CPU아키텍쳐, 시간, OPTIONAL_HEADER의 크기 등)
        IMAGE_OPTIONAL_HEADER: 로딩, 실행에 필요한 추가 정보 저장 (이미지베이스(PE파일 저장되는 시작 주소), RVA, VA등이 저장됨)
    • 파일 헤더
    • 선텍적 헤더
  • 섹션 헤더: 각 섹션에 대한 정보를 담은 부분
    예)
    • Name: 섹션의 이름 (.text, .data, .rdata 등)
    • Virtual size: 메모리에 로드 될 때 섹션의 크기
    • Virtual Address: 섹션 가상주소 오프셋
    • Pointer to Raw data: 파일 내에서 차지하는 실제 크기 (Virtual Address와 다를 수도 있다)
  • 섹션 데이터 헤더: 실제 사용되는 코드, 데이터 리소스 등을 담은 부분
    • 섹션의 이름에 따른 내용들 예)
      • .text: 실행 코드
      • .data: 초기화된 전역, 정적 변수
      • .rdata: 변하지 않는 값 (리터럴, 변경 안한 전역변수)
      • .bss: 초기화되지 않은 전역, 정적 변수
      • .rsrc: 리소스 데이터
        물론 관습적인 이름이라 섹션 헤더에서 이름만 잘 정의되었다면 딴 이름으로 써도 됨

주소 지정 방법

  • pFile: PE파일 내부의 오프셋 값 (PE파일 시작부터 얼마나 떨어져 있는가?)
  • RVA: PE파일 메모리에 로드되었을 때 저장되는 상대주소 (이미지베이스 기준 상대주소)
  • VA: 가상메모리 상에서 나타나는 실제 주소 (이미지베이스 + RVA)
    pFile은 물리적으로 하드디스크에 저장되었을 때 의미있는 값, RVA, VA는 메모리에 로드되었을 때 의미있는 값

IAT(Important Address Table): 어떤 라이브러리의 무슨 함수를 가져다 쓰는지 기록한 테이블
API이름과 실제 API의 주소를 기록한다.

728x90
반응형