카테고리 없음

리버싱 드림핵 3 정리

미숫가루빙수 2024. 3. 24. 20:21

 

 

컴퓨터 구조

 

  1. 컴퓨터의 기능 구조에 대한 설계: 컴퓨터가 연산을 효율적으로 수행하기 위해 필요한 기능들을 고안하고 설계하는 분야이다. 여기에는 폰 노이만 구조, 하버드 구조, 수정된 하버드 구조 등이 포함된다.
  2. 명령어 집합구조(ISA, Instruction Set Architecture): CPU의 명령어를 설계하는 분야로, CPU가 처리해야하는 명령어를 정의한다. 대표적으로 ARM, MIPS, AVR, 인텔의 x86 및 x86-64 등이 있다.
  3. 마이크로 아키텍처(Micro Architecture): CPU의 하드웨어적 설계를 다루며, 정의된 명령어 집합을 효율적으로 처리할 수 있도록 CPU의 회로를 설계한다.

 

 

컴퓨터 구조의 세부 분야

 

  • 기능 구조의 설계
    • 폰 노이만 구조
    • 하버드 구조
    • 수정된 하버드 구조
  • 명령어 집합구조
    • x86, x86-64
    • ARM
    • MIPS
    • AVR
  • 마이크로 아키텍처
    • 캐시 설계
    • 파이프라이닝
    • 슈퍼 스칼라
    • 분기 예측
    • 비순차적 명령어 처리
  • 하드웨어 및 컴퓨팅 방법론
    • 직접 메모리 접근

 

폰 노이만 구조

  • 폰 노이만은 초기 컴퓨터 과학자로, 컴퓨터의 연산, 제어, 저장이 세 가지 핵심 기능이 필요하다고 주장했다.
  • 현대 컴퓨터는 이러한 기능을 중앙처리장치(CPU)와 기억장치(memory)를 사용하여 수행한다.
  • CPU는 연산 처리와 시스템 제어를 담당하며, ALU, 제어장치, 레지스터 등의 요소로 구성된다.
  • 기억장치는 데이터를 저장하는 역할을 하며, 주기억장치와 보조기억장치로 나뉘며, 주기억장치는 프로그램 실행에 필요한 데이터를 임시로 저장하고, 보조기억장치는 장기적인 데이터 보관에 사용된다.
  • 버스는 장치 간 데이터와 제어 신호를 교환하는 통로를 제공하며, 데이터 버스, 주소 버스, 제어 버스 등이 있다.

CPU 내부 저장장치의 필요성

  • CPU는 빠른 연산을 위해 레지스터와 캐시와 같은 내부 저장장치를 가진다.
  • CPU의 속도는 외부의 주기억장치나 보조기억장치와 비교하여 극도로 빠르기 때문에, 이들 저장장치만 사용하면 데이터 교환에 병목 현상이 발생할 수 있다.
  • 따라서 CPU 내부에 저장장치를 두어 데이터 교환 속도를 높이고, 효율적인 연산을 돕는다.

명령어 집합 구조

  • 명령어 집합 구조는 CPU가 해석하는 명령어의 집합을 말하며, 프로그램 코드는 이러한 명령어로 작성된다.
  • 다양한 ISA가 존재하며, 사용 목적과 환경에 따라 선택된다.
  • 이 코스에서는 x86-64 아키텍처를 중점적으로 다루며, 이는 고성능 프로세서를 설계하기 위한 것으로, 데스크톱 및 랩톱과 같은 환경에 적합하다.
  • 다른 ISA에 대한 학습은 이후 심화 과정에서 다룰 예정이며, x86 기반 CPU의 점유율이 높아 이를 기반으로 하는 것이 이해와 응용에 유리하다.

 

 

x86-64 아키텍처

  • 1999년, AMD는 인텔의 32비트 CPU 아키텍처인 IA-32를 64비트로 확장한 AMD64 아키텍처를 발표했다.
  • AMD64가 시장에서 인정받자, 이를 기반으로 한 x86-64 아키텍처가 널리 사용되기 시작했다.
  • 현재 대다수 개인용 컴퓨터는 x86-64 아키텍처 기반의 CPU를 탑재하고 있다.

n 비트 아키텍처

  • CPU가 한 번에 처리할 수 있는 데이터의 크기를 나타내는 단위인 WORD의 크기를 나타낸다.
  • 64비트 아키텍처는 보다 큰 가상메모리를 제공하여 성능을 향상시킨다.
  • 가상메모리의 크기는 CPU 아키텍처에 따라 제한된다.

x86-64의 다양한 이름

  • Intel64, IA-32e, amd64, EM64T 등의 다양한 이름을 가지고 있다.
  • 이는 AMD와 인텔이 서로의 기술을 활용하고 명칭을 사용하는 등 복잡한 개발과정을 거쳤기 때문이다.

레지스터

  • CPU 내부의 저장장치로서, 데이터를 빠르게 접근하여 사용한다.
  • 범용 레지스터, 세그먼트 레지스터, 명령어 포인터 레지스터, 플래그 레지스터 등이 있다.
  • x86-64 아키텍처의 레지스터는 IA-32와의 호환성을 유지하면서 확장되었다.

 

 

 

  1. 가상 메모리(Virtual Memory):
    • 운영체제는 프로세스에게 사용 가능한 메모리 공간을 할당해 줍니다. 이를 가상 메모리라고 한다.
    • 프로세스가 사용하는 실제 물리 메모리(RAM)와는 별도로, 가상 메모리는 주소 공간으로서의 역할을 한다.
  2. 메모리 레이아웃(Memory Layout):
    • 프로세스의 가상 메모리는 여러 영역으로 나뉘어집니다. 이러한 영역들을 메모리 레이아웃이라고 한다.
    • 주요한 메모리 레이아웃 영역으로는 코드(Code), 데이터(Data), 스택(Stack), 힙(Heap) 등이 있다.
  3. 주요 메모리 레이아웃 영역:
    • 코드(Code): 프로그램의 명령어들이 저장되는 영역으로, 실행 가능한 기계어 코드가 위치한다.
    • 데이터(Data): 정적(static) 및 전역(global) 변수들이 저장되는 영역이다.
    • 스택(Stack): 지역 변수 및 함수 호출 시 사용되는 메모리 공간입니다. 후입선출(LIFO) 방식으로 동작한다.
    • 힙(Heap): 동적으로 할당된 메모리 공간으로, 프로그램 실행 중에 동적으로 크기가 할당되고 해제된다.
  4. 권한 설정:
    • 각각의 메모리 레이아웃 영역에는 적절한 권한이 설정됩니다. 예를 들어, 코드 영역은 실행 권한만을 가지며, 데이터 영역은 읽기/쓰기 권한을 가진다.
    • 이러한 권한 설정은 보안 및 안정성을 유지하기 위해 중요하다.

 

  • 섹션
    • .text
    • .data
    • .rdata
  • 스택
  1. .text 섹션:
    • 실행 가능한 기계 코드가 위치하는 영역입니다.
    • 읽기 및 실행 권한이 부여됩니다.
    • 예시: 프로그램의 명령어들이 기계어 코드로 변환되어 이 섹션에 위치합니다.
  2. .data 섹션:
    • 컴파일 시점에 값이 정해진 전역 변수들이 위치하는 영역입니다.
    • 읽기 및 쓰기 권한이 부여됩니다.
    • 예시: 전역 변수들이나 초기화된 데이터가 위치합니다.
  3. .rdata 섹션:
    • 컴파일 시점에 값이 정해진 전역 상수와 참조할 DLL 및 외부 함수들의 정보가 저장됩니다.
    • 읽기 권한만 부여되며 쓰기는 불가능합니다.
    • 예시: 전역 상수 및 문자열들이 위치하며, 일부 시스템 정보도 저장됩니다.

PE 파일의 메모리 레이아웃에는 섹션 이외에도 중요한 부분이 있습니다.

  1. 스택(Stack):
    • 각 쓰레드는 자신만의 스택 공간을 가지고 있으며, 지역 변수나 함수의 리턴 주소 등이 저장됩니다.
    • 읽기 및 쓰기 권한이 부여됩니다.
    • 예시: 함수 호출 시 사용되는 지역 변수들이 저장됩니다.
  2. 힙(Heap):
    • 동적으로 할당된 메모리 공간으로, 프로그램이 필요에 따라 사용합니다.
    • 읽기 및 쓰기 권한이 부여되며, 실행 권한도 부여될 수 있습니다.
    • 예시: malloc() 또는 new로 할당된 메모리가 위치합니다.

 

 

요약

.text 실행 가능한 코드가 저장된 영역 읽기, 실행 main() 등의 함수 코드
.data 초기화된 전역 변수가 위치하는 영역 읽기와 쓰기 초기화된 전역 변수, 전역 상수
.rdata 초기화된 전역 상수나 임포트 데이터가 위치하는 영역 읽기 전용 전역 상수, 임포트 데이터
스택 일시적으로 저장하고 사용하는 임시 영역 읽기, 쓰기 지역 변수, 함수의 인자 등
자유롭게 사용할 수 있는 영역 읽기, 쓰기 malloc(), calloc() 등으로 할당 받은 메모리