Reverse Engineering

Background: Windows Memory Layout

박연준 2023. 7. 2. 15:00
  • 메모리 레이아웃(Memory Layout)이란 프로세스 가상 메모리(Virtual Memory)의 구성을 말한다.
  • 프로그램을 실행하면 운영체제는 프로세스에게 사용 가능한 메모리 공간을 할당해 준다.
  • 컴퓨터 과학에서는 이 공간을 가상 메모리라고 부른다.
  • 운영체제는 프로그램의 정보를 참조하여 프로그램에 저장된 데이터가 적절한 영역에 저장되게 한다.

프로세스 메모리 구조

섹션

  • 윈도우의 PE 파일은 PE 헤더와 1개 이상의 섹션으로 구성되어 있다.
  • 여기서 섹션이란, 유사한 용도로 사용되는 데이터가 모여있는 영역이다.
  • 섹션에 대한 정보는 PE 헤더에 적혀있다. PE 헤더에 저장되는 섹션과 관련된 데이터 중, 중요한 것은 다음과 같다.
    • 섹션의 이름
    • 섹션의 크기
    • 섹션이 로드될 주소의 오프셋
    • 섹션의 속성과 권한
  • 윈도우는 PE를 실행할 때, 이 정보를 참조하여 PE의 각 섹션들을 가상 메모리의 적절한 세그먼트에 매핑한다.
  • PE에 필수로 존재해야하는 섹션이 정해진 것은 아니지만, “.text”, “.data”, “.rdata” 섹션이 일반적으로 사용된다.

.text

  • .text 섹션은 실행 가능한 기계 코드가 위치하는 영역이다.
  • 프로그램이 동작하려면 코드를 실행할 수 있어야 하므로 이 세그먼트에는 읽기 권한과 실행 권한이 부여된다.
  • 반면 쓰기 권한이 있으면 공격자가 악의적인 코드를 삽입하기가 쉬워지므로, 대부분의 현대 운영체제는 이 세그먼트에 쓰기 권한을 제거한다.

.data

  • .data 섹션에는 컴파일 시점에 값이 정해진 전역 변수들이 위치한다.
  • CPU가 이 섹션의 데이터를 읽고 쓸 수 있어야 하므로, 읽기/쓰기 권한이 부여된다.

.rdata

  • .rdata 섹션에는 컴파일 시점에 값이 정해진 전역 상수와 참조할 DLL 및 외부 함수들의 정보가 저장된다.
  • CPU가 이 섹션의 데이터를 읽을 수 있어야 하므로, 읽기 권한이 부여되지만, 쓰기는 불가능하다.
  • 과거에는 참조할 DLL과 외부 함수들의 정보를 .idata 섹션에 저장하였으나, 최근에는 대부분 .rdata에 저장한다.

섹션이 아닌 메모리

  • 윈도우의 가상 메모리 공간에는 섹션만 로드되는 것이 아닌 스택과 힙 역시 가상 메모리 공간에 적재된다.

스택

  • 윈도우즈 프로세스의 각 쓰레드는 자신만의 스택 공간을 가지고 있다.
  • 보통 지역 변수나 함수의 리턴 주소가 저장된다.
  • 이 영역은 자유롭게 읽고 쓸수 있어야 하기 때문에 읽기/쓰기 권한이 부여된다.
  • 스택은 확장될 때, 기존 주소보다 낮은 주소로 확장되기 때문에 아래로 자란다고 종종 표현한다.

  • 힙은 프로그램이 여러 용도로 사용하기 위해 할당받는 공간이다.
  • 모든 종류의 데이터가 저장될 수 있다.
  • 스택과 다른 점은 비교적 스택보다 큰 데이터도 저장할 수 있고 전역적으로 접근이 가능하도록 설계되었다. 또한 실행중 동적으로 할당받는 점 역시 다르다.
  • 권한은 보통은 데이터를 읽기/쓰기 권한만을 가지나, 상황에 따라 실행 권한을 가지는 경우도 존재한다.

'Reverse Engineering' 카테고리의 다른 글

x86 Assembly: Essential Part(2)  (0) 2023.07.02
x86 Assembly: Essential Part(1)  (0) 2023.07.02
Background: Computer Architecture  (0) 2023.07.02
Static Analysis vs. Dynamic Analysis  (0) 2023.07.02
Background: Binary  (0) 2023.07.02