[시스템해킹] 리눅스 메모리 구조 & 컴퓨터 구조

sheiskone·2022년 9월 27일

시스템해킹

목록 보기
1/6

1. 리눅스 프로세스의 메모리 - 세그먼트

  • CPU는 실행할 명령어와 명령어 처리에 필요한 데이터를 메모리에서 읽고, Instruction Set Architecture(ISA)에
    따라 이를 처리 후 연산의 결과를 다시 메모리에 적재하므로 CPU와 메모리 사이에 밀접한 연관이 있음
  • 만약 공격자가 메모리를 악의적으로 조작할 수 있다면 조작된 메모리 값에 의해 CPU도 잘못된 동작을 할 수 있음 -> 메모리 오염
  • 리눅스에서는 프로세스 메모리를 크게 5가지의 세그먼트로 구분함(용도별로 나눔) -> 코드, 데이터, BSS, 힙, 스택
  • 코드 세그먼트: 실행 가능한 기계 코드가 위치하는 영역. 읽기 및 실행 권한 부여. 현대 운영체제는 이 세그먼트는 쓰기 권한이 제거되어 있음.
  • 데이터 세그먼트: 컴파일 시점에 값이 정해진 전역 변수 및 상수들이 위치함. 읽기 권한이 부여됨. 쓰기 가능한 세그먼트와 쓰기가 불가능한 세그먼트로 분류됨.
    - data segment: 전역 변수와 같이 프로그램이 실행되면서 값이 변할 수 있는 데이터들이 위치
    - rodata segment: 프로그램이 실행되면서 값이 변하면 안되는 데이터들이 위치. 쓰기가 불가능한 세그먼트
  • BSS 세그먼트: 컴파일 시점에 값이 정해지지 않은 전역 변수가 위치하는 메모리 영역. 읽기 및 쓰기 권한 부여. 이 영역은 프로그램 시작 시 모두 0으로 초기화됨.
  • 스택 세그먼트: 함수의 인자나 지역 변수와 같은 임시 변수들이 실행 중에 여기 저장됨. 읽기 및 쓰기 권한 부여. 스택 프레임이라는 단위로 사용. 스택이 확장될 때 기존 주소보다 낮은 주소로 확장됨.
  • 힙 세그먼트: 스택과 마찬가지로 동적으로 할당 가능. 스택 세그먼트와 반대 방향으로 자람. 읽기 및 쓰기 권한 부여.

2. 컴퓨터 구조 & 명령어 집합 구조

  • 컴퓨터 구조: 컴퓨터가 효율적으로 작동할 수 있도록 하드웨어 및 소프트웨어의 기능을 고안하고, 이들을 구성하는 방법
  • 중앙처리장치(CPU): 프로그램의 연산을 처리하고 시스템을 관리하는 컴퓨터의 두뇌. 프로세스의 코드를 불러오고, 실행하고, 결과를 저장하는 일련의 모든 과정 발생. 산술논리장치(ALU), 제어장치, 레지스터로 구성.
  • 명령어 집합구조(ISA): 전체적인 컴퓨터 구조 중에서 특히 CPU가 사용하는 명령어와 관련된 설계. 기계어로 이루어진 프로그램을 실행하면 이 명령어들을 CPU가 읽고 처리. 다양한 ISA가 개발되고 사용되는 이유는 모든 컴퓨터가 동일한 수준의 연산 능력을 요구하지 않으며, 컴퓨팅 환경도 다양하기 때문.

3. 인텔의 x86-64 아키텍처

  • x64 아키텍처: 인텔의 64비트 CPU 아키텍처. 64는 CPU가 한번에 처리할 수 있는 데이터의 크기. 이를 WORD라고 함.
  • 범용 레지스터: 주용도가 존재하고 그 외의 다양한 용도로 사용될 수 있는 레지스터. x86-64에서 각각의 범용 레지스터는 8바이트를 저장할 수 있으며, 부호 없는 정수를 기준으로 2^64-1까지의 수를 나타낼 수 있음.
  • 세그먼트 레지스터: cs, ss, ds, es, fs, gs 총 6가지 세그먼트 레지스터가 존재. 각 레지스터의 크기는 16비트.
  • 명령어 포인터 레지스터: 기계어 코드로 이루어진 프로그램에서 CPU가 어느 부분의 코드를 실행할지 가리키는 역할. x64 아키텍처의 명령어 레지스터는 RIP로, 크기는 8바이트.
  • 플래그 레지스터: CPU의 현재 상태를 저장. x64 아키텍처에서는 RFLAGS라고 불리는 64비트 크기의 플래그 레지스터가 존재.
  • 레지스터 호환: x86-64 아키텍처는 IA-32의 64비트 확장 아키텍처이며, 호환이 가능. IA-32에서 CPU의 레지스터들은 32비트 크기를 가지며, 이들의 명칭은 각각 eax, ebx, ecx, edx, esi, edi, esp, ebp. x86-64에서도 그대로 사용 가능.

0개의 댓글