본문 바로가기
hacking/pwnable

[Dream hack] Background: Computer Architecture

by ilp 2024. 4. 19.
반응형

 


https://dreamhack.io/lecture/courses/43

 

Dreamhack | 강의 | Dreamhack

 

dreamhack.io


강의 내용

  1. 서론
  2. 컴퓨터 구조
  3. 명려어 집합구조
  4. x86-64 아키텍처, 아키텍처 레지스터

서론

  • 컴퓨터 구조(Computer Architecture)
    • 컴퓨터 과학에서 이러한 설계를 컴퓨터 구조라고 한다.
    • 서로 다른 부품들이 모여서 '컴퓨터'라는 하나의 기계로서 작동할 수 있는 것은 컴퓨터에 대한 기본 설꼐가 존재하기 떄문이다.
    • 이 설꼐에 맞춰서 여러 하드웨어가 개발되고, 이들을 조립해서 컴퓨터가 완성된다.
  • 명령어 집합 구조(Instruction Set Architecture, ISA)
    • 전체적인 컴퓨터 구조중에서 CPU가 사용하는 명령어와 관련된 설계이다.
    • 가장 널리 사용된 ISA중 하나가 _x86-64아키텍처_이다.

컴퓨터 구조💻

  • 컴퓨터 구조(Computer Architecture) 🖥️
    • 컴퓨터가 효율적으로 작동 할 수 있도록 하드 웨어 및 소프트웨어의 기능을 고안하고, 이들을 구성하는 방법이다.
    • 기능 구조에 대한 설계, 명령어 집합구조, 마이크로 아키텍쳐, 하드웨어 및 컴퓨터 설꼐 등
    • ex) 폰노이만 구조, 하버드 구조, 하버드 구조
  • 명령어 집합구조(Instruction Set Architecture) 
    • CPU가 처리해야하는 명령어를 설계하는 분야.
    • 대표적: ARM, MIPS, AVR, 인텔의 x86 및 n86-64 등이 있다.
  • 마이크로 아키텍처(Micro Architecture)
    • CPU 하드웨어적 설계,
    • 정의된 명령어 집합을 효율적으로 처리할 수 있도록 CPU회로를 설계하는 분야이다.

폰 노이만 구조

  • 서론
    • 폰노이만은 컴퓨터에 _연산, 제어, 저장_의 기능이 필여하다고 생각했다.
    • 근대의 컴퓨터는 중앙처리 장치, 기억장치, 버스를 사용한다.
  • 중앙처리장치 (Central Processing Unit, CPU) 🧠
    • 프로그램의 연산을 처리, 시스템을 관리하는 컴퓨터의 두뇌이다.
    • 프로세스의 코드를 _불러오고, 실행하고, 결과_를 저장 하는 과정이 일어난다.
    • 구성 요소
      • 산술논리장치(Arithmetic Logic Unit, ALU)
      • 제어장치(Control Unit)
      • 레지스터(Register)
  • 기억장치 (memory) 💾
    • 컴퓨터가 동작하는데 필요한 여러 데이터저장하기 위해 사용된다.
      (주기억 장치와, 보조기억장치로 분류된다.)
    • 주기억 장치
      • 프로그램 실행 과정에서 필요한 데이터들을 임시로 저장
      • (Random-Access Memory, RAM)
    • 보조기억 장치
      • 운영체제, 프로그램 등과 같은 데이터를 장기 보관 할 때 사용
      • 하드 드라이브(Hard Disk Drive, HDD), SSD(Solid State Drive)
  • 버스 (bus) 🚌
    • 컴퓨터 부품과 부품 사이 또는 컴퓨터 사이에 신호를 전송하는 통로이다.
    • 예시
      • 데이터 버스(Data Bus): 데이터가 이동
      • 주소 버스(Address Bus): 주소 지정
      • 어 버스(Control Bus): 읽기/쓰기를 제어
      • 렌선, 데이터 전송 소프트 웨어, 프로토콜

명령어 집합 구조

  • 명령어 집합 구조 (Instruction Set Architecture, ISA
    • CPU가 해석하는 명렁의 집합
    • 프로그램은 기계어로 이루어져있는데, 프로그램을 실행하면 이 명령어들을 CPU 가 읽고 처리한다.
    • ISA 종류(ex:  IA-32, x86-64(x64), MIPS, AVR )


x86-64 아키텍처

  • x86-64 아키텍처
    • 1999년, AMD가 인텔의 32비트 아키텍처 IA-32를 64비트로 확장AMD64 아키텍처를 발표했다.
    •  AMD64가 시장에서 인정받자, 다양한 회사에서 이를 기반으로 아키텍처를 발표했다.
    • 이과정 에서 보다 범용적이고 중립적으로 지칭되는 x86-64라는 명칭이 탄생했다.
  • n비트 아키텍처
    • 64비트 아키텍처, 32비트 아키텍처에서 64와 32는 CPU가 한번에 처리할 수 있는 데이터의 크기이다.
    • WORD
      • 컴퓨터 과학에서 CPU가 이해 할 수 있는 데이터의 단위
      • WORD의 크기는 CPU의 설계에 따라 달라진다.
  • WORD가 크면 유리한 점
    • 32비트 아키텍처
      • CPU가 제공할 수 있는 가상메모리의 크기가 작다.
      • 4,294,967,296바이트(=4기가 바이트)가 최대 가상 메모리 크기
        (일상으로 사용할때는 적절할 수 있지만, 많은 메모리 자원을 소모하는 것들에서는 부족할 수 있다.)
    • 64비트 아키텍처
      • 이론상 16엑사 바이트(=16,777,216 테라이바이트)의 가상 메모리
      • 웬만하면 완전 사용이 불가능할 정도로 크다,
        (메모리 자원이 부족해서 최고 성능을 못내거나 실행이 불가한 상황은 거의 없다.)

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

  • 서론
    • 레지스터는 산술 연산에 필요한 데이터를 저장하거나 주소를 저장하고 참조하는등 다양한 용도로 사용된다.
    • 범용 레지스터(General Register),세그먼트 레지스터(Segment Register),명령어 포인터 레지스터(Instruction Pointer Register, IP),플래그 레지스터(Flag Register)
  • 범용 레지스터 🧺
    • x86-64에서 각각의 범용 레지스터는 8바이트 저장할 수 있으며,
    • 부호 없는 정수를 기준으로 까지의 수를 나타낼 수 있다.

  • 세그먼트 레지스터 🗂️
    • cs, ss, ds, es, fs, gs총 6가지 세그먼트 레지스터가 있다. (각 레지스터의 크기는 16비트이다.)
    • 과거 시절엔 세그먼트 레지스터를 이용하여 사용 가능한 물리 메모리의 크기를 키우려고 했다.
      (당시에는 범용 레지스터의 크기가 작아서 사용가능한 메모리의 주소 폭이 좁았지만 지금은 넓어서 이런 용도로는 잘 사용되지 않는다.)
    • x64에서 cs,,ds,ss 레지스터는 코드영역과 데이터, 스택 메모리 여역을 가리킬떄 사용되고,
      나머지는 범용적인 용도로 제작됬다.
  • 명령어 포인터 레지스터 👇
    • 프로그램은 일련의 기계어 코드들로 이루어져 있따.,
    • 이 중에서 CPU가 어느 부분의 코드를 실행할지 가리키는것이 명령어 포인터 레지스터의 역할 이다.
    • x64 아키텍처의 명령어 레지스터는 rip이며, 크기는 8바이트이다.

플래그 레지스터 🏳️🏴

  • 플래그 레지스터
    • 프로세서의 현재 상태를 저장하고 있는 레지스터이다.
    • x64 아키텍처에는  RFLAGS라고 불리는 64비트 크기위 플래그 레지스터가 존재하며
      (과거 16비트 레지스터가 확장된 것이다.)
    • 깃발을 올리고, 내리는 행위로 신호를 전달하듯, 플래그 레지스터는 여러 비트들로 CPU의 현재 상태를 표현한다.
  • RFLAGS는 64비트이므로 최대 64개 플래그를 사용할 수 있지만 실제로는 20여개의 비트만 사용한다.(그림 참고)

  • 그중에서도 아래 표와 같은것들을 주로 접하게 될것이다.
    플래그를 사용하는 간단한 예로, 3의 값을 갖는 a와 5의 값을 갖는 b가 있을때, a에서 b를 뺴는 연산을 하면, 
    연산의 결과가 음수이므로 SF가 설정된다. CPU는 SF를 통해 a가 b보다 작았음을 알 수 있따.


레지스터 호환 

  • 레지스터 호환
    • x86-64아키텍처는 IA-32의 64비트 확장 아키텍처이며, 호환이 가능하다.
      IA-32에서 CPU레지스터들은 32비트 크기르 가지고 이들의 명칭은 eax, ebx,ecx,edx,esi,edi,esp,ebp 이다.
      (x86-64에서도 그대로 사용 가능하다.)
    • rax, rbx,rex, rdx, rsi, rdi, rsp, rbp가 이들의 확장된 형태이다.
      eax, ebx 등은 확장된 레지스터의 하위 32비트를 가리킨다.
    • 마찬가지로 과거 16비트 아키택처인 IA-16과 호환을 위해 ax, bx,cx,dx,si,di,sp,bp eax, ebx , ecx , edx, esi, edi, esp, ebp의 하위 16비트를 가리킨다.


결론

  • 범용 레지스터(General Register): 주용도 외의 용도로 자유롭게 사용 가능한 레지스터
  • 그먼트 레지스터(Segment Register): 과거에는 메모리 세그멘테이션이나, 가용 메모리 공간의 확장을 위해 사용됬다.  현재는 주로 메모리 보호를 위해 사용된다.
  • 프래그 레지스터(Flag Register): CPU의 상태를 저장하는 레지스터
  • 명령어 포인터 레지스터(Instruction Pointer Register, IP): CPU가 실행해야할 코드를 가리키는 레지스터

반응형