본문 바로가기

보안

[시스템해킹]Background: 컴퓨터 구조, 레지스터, ...

컴퓨터 구조(Computer Architecture)

: 컴퓨터가 효율적으로 작동할 수 있도록 하드웨어 및 소프트웨어의 기능을 고안하고, 이들을 구성하는 방법

 

컴퓨터 기능 구조에 대한 설계, 명령어 집합 구조, 마이크로 아키텍처, 그리고 기타 하드웨어 및 컴퓨팅 방법에 대한 설계 등이 포함

- 컴퓨터 기능 구조에 대한 설계: 컴퓨터가 연산을 효율적으로 하기 위해 어떤 기능들이 컴퓨터에 필요한지 고민하고, 설계하는 분야

- 명령어 집합 구조(Instruction Set Architecture): CPU가 처리해야 하는 명령어를 설계하는 분야

- 마이크로 아키텍처(Micro Architecture): CPU의 하드웨어적인 설계, 명령어 집합을 효율적으로 처리할 수 있도록, CPU의 회로를 설계하는 분야

 

x86-64(=amd64) 아키텍처

- n비트 아키텍처에서 n은 CPU가 한번에 처리할 수 있는 데이터의 크기, CPU가 이해할 수 있는 데이터의 단위라는 의미에서 WORD라 함

- 일반적인 32비트 아키텍처에서 ALU는 32비트까지 계산할 수 있으며, 레지스터의 용량 및 각종 버스들의 대역폭이 32비트임

- 32비트 아키텍처의 CPU가 제공할 수 있는 가상메모리의 크기는 4GB로 부족함

- 64비트 아키텍처에서는 이론상 16엑사바이트(16,777,216TB)의 가상메모리를 제공해, 웬만하면 완전한 사용이 불가능할 정도로 큰 크기임

 

x86-64 아키텍처의 레지스터

- 레지스터는 CPU가 데이터를 빠르게 저장하고 사용할 때 이용하는 보관소로, 산술 연산에 필요한 데이터를 저자하거나 주소를 저장하고 참조하는 등 다양한 용도로 사용됨

- 범용 레지스터, 세그먼트 레지스터, 명령어 포인터 레지스터, 플래그 레지스터가 존재함

  • 범용 레지스터: 주용도는 있으나, 그 외 다양한 용도로 사용 가능한 레지스터 (8바이트 저장 가능)
    • rax(accumulator register): 함수의 반환값
    • rbx(base register): 주 용도 x
    • rcx(counter register): 반복문의 반복 횟수, 각종 연산의 시행 횟수
    • rdx(data register): 주 용도 x
    • rsi(source index): 데이터를 옮길 때 원본을 가리키는 포인터
    • rdi(destination index): 데이터를 옮길 때 목적지를 가리키는 포인터
    • rsp(stack pointer): 사용중인 스택의 위치를 가리키는 포인터
    • rbp(stack base pointer): 스택의 바닥을 가리키는 포인터
  • 세그먼트 레지스터: 16비트 크기
    • x64 아키텍처에는 cs, ss, ds, es, fs, gs 6가지 존재 
    • cs, ds, ss 레지스터는 코드 영역과 데이터, 스택 메모리 영역을 가리킬 때 사용되고 나머지는 운영체제별 용도를 결정할 수 있도록 범용적 용도로 제작됨
  • 명령어 포인터 레지스터: CPU가 어느 부부의 코드를 실행할 지 가리키는 역할
    • x64 아키텍처에서는  rip, 8바이트 크기
  • 플래그 레지스터: 프로세서의 현재 상태를 저장하고 있는 레지스터
    • x64 아키텍처에서는 RFLAGS라고 불리는 64비트 크기의 플래그 레지스터 존재
    • RFLAGS는 64비트이므로 최대 64개의 플래그를 사용할 수 있지만, 실제로는 아래 그림의 20여개 비트만을 사용
레지스터 호환

- x86-64 아키텍처는 IA-32의 64비트 확장 아키텍처이며, 호환이 가능함

- IA-32의 레지스터는 32비트 크기, eax, ebx, ecx, edx, esi, edi, esp, ebp

- eax, ebx 등은 확장된 레지스터의 하위 32비트를 가리킴 ex> eax는 rax의 하위 32비트를 의미

x86-64 레지스터

 

 

드림핵 시스템해킹 로드맵 참고