Iriton's log

Background: Computer Architecture 본문

Pwnable/Study

Background: Computer Architecture

Iriton 2024. 3. 19. 13:52

*본 포스트는 Dreamhack - Systemhacking Lecture 을 참고하여 작성되었습니다.

컴퓨터 구조와 명령어 집합 구조


컴퓨터 구조

컴퓨터가 효율적을 작동할 수 있도록 HW, SW의 기능을 고안하고 구성하는 방법을 말함.

폰 노이만 구조, 하버드 구조, 수정된 하버드 구조가 있다.

CPU의 명령어에 대한 설계는 명령어 집합 구조(Instruction Set Architecture) - 명령어 설계

CPU의 하드웨어적 설계는 마이크로 아키텍처(Micro Architecture) - 회로 설계

 

폰 노이만 구조

중앙처리장치(Central Processing Unit, CPU)

연산, 제어 담당

  • 산술논리장치
    • 산술/논리 연산을 수행
  • 제어장치
    • CPU 제어
  • 레지스터
    • 데이터 저장

기억장치

컴퓨터가 동작하는데 필요한 여러 데이터를 저장

용도에 따라 주기억장치와 보조기억장치로 나뉨

  • 주기억장치
    • 프로그램 실행 과정에서 필요한 데이터들을 임시로 저장
    • RAM(Random-Access Memory)
  • 보조기억장치
    • OS, Program 등 같은 데이터를 장기간 보관할 때 사용
    • HDD, SDD

버스

컴퓨터 부품과 부품 사이 또는 컴퓨터와 컴퓨터 사이에 신호를 전송하는 통로

  • 데이터 버스
  • 주소 버스
  • 제어 버스

데이터 전송 SW, Protocol도 버스라고 불린다.

💡 기억장치가 있는데 CPU에 레지스터가 있는 이유
CPU-기억장치 간의 데이터 교환 속도보다 CPU의 연산 속도가 훨씬 빠르기 때문에 병목현상이 발생할 수 있다.
교환할 데이터 수는 계속해서 늘어나는데 그에 반해 교환 속도는 느리기 때문이다.
따라서 CPU 내부에 레지스터와 캐시라는 저장장치를 가지고 있어야 더 효율적으로 처리를 할 수 있기 때문이다.

 

명령어 집합 구조(Instruction Set Architecture, ISA)

CPU가 해석하는 명령어의 집합

IA-32, x86-64, MIPS, AVR 등 다양한데 이렇게 다양한 이유는 컴퓨터의 연산 능력과 컴퓨팅 환경이 다양하기 때문이다.

 

x86-64 아키텍처


x86-64 아키텍처

현대 대다수 개인용 컴퓨터가 x86-64 아키텍처 기반의 CPU를 탑재하고 있다.

 

n비트 아키텍처

CPU가 이해할 수 있는 데이터의 단위인 WORD를 말한다.

따라서 64비트 아키텍처에서는 ALU(산술논리연산장치)가 64비트까지 계산할 수 있으며 레지스터의 용량 및 각종 버스의 대역폭이 64비트이다. 따라서 CPU 설계상 64비트의 데이터까지만 처리할 수 있다.

 

WORD가 크면 유리한 점

32비트 아키텍처의 CPU가 제공할 수 있는 가상메모리의 크기가 64비트보다 현저히 작기 때문에 현대 PC는 거의 64비트를 쓴다.

 

레지스터

범용 레지스터

이름 주용도

rax(accumulator) 함수의 반환 값
rbx(base)  
rcx(counter) 반복문의 반복 횟수, 각종 연산의 시행 횟수
rdx(data)  
rsi(source index) 데이터를 옮길 때 원본을 가리키는 포인터
rdi(destination index) 데이터를 옮길 때 목적지를 가리키는 포인터
rsp(stack pointer) 사용 중인 스택의 위치를 가리키는 포인터
rbp(base pointer) 스택의 바닥을 가리키는 포인터

주 용도 이외에 다른 용도로 쓰일 수도 있다.

 

세그먼트 레지스터

  • cs, ss, ds: 코드 영역과 데이터, 스택 메모리 영역을 가리킬 때 사용
  • es, fs, gs: OS별로 용도를 결정할 수 있도록 범용적인 용도로 제작

 

명령어 포인터 레지스터

x64는 rip

 

플래그 레지스터

프로세서의 현재 상태를 저장

x64에서는 RFLAGS라고 불리는 64비트 크기의 플래그 레지스터

이론적으로 64개의 플래그를 사용할 수 있지만 실제로는 20여개의 비트만 사용한다.

플래그 의미

CF(Carry Flag) 부호 없는 수의 연산 결과가 비트의 범위를 넘을 경우
ZF(Zero Flag) 연산의 결과가 0일 경우
SF(Sign Flag) 연산의 결과가 음수일 경우
OF(Overflow Flag) 부호 있는 수의 연산 결과가 비트 범위를 넘을 경우

 

호환

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

IA-32에서 레지스터들은 32비트 크기를 가지며 eax, ebx… 이다.(리버싱을 하다 보면 접하는 레지스터들)

 

요약

  • 범용 레지스터(General Register): 주 용도는 있으나, 그 외의 용도로도 자유롭게 사용할 수 있는 레지스터. x64에는 rax, rbx, rcx, rdx, rsi, rdi, rsp, rbp, r8-r15가 있다.
  • 세그먼트 레지스터(Segment Register): 과거에는 메모리 세그멘테이션이나, 가용 메모리 공간의 확장을 위해 사용됐으나, 현재는 주로 메모리 보호를 위해 사용되는 레지스터 x64에는 cs, ss, ds, es, fs, gs가 있다.
  • 플래그 레지스터(Flag Register): CPU의 상태를 저장하는 레지스터
  • 명령어 포인터 레지스터(Instruction Pointer Register, IP): CPU가 실행해야할 코드를 가리키는 레지스터. x64에서는 rip가 있다.

'Pwnable > Study' 카테고리의 다른 글

Background: Calling Convention  (0) 2024.04.01
Exploit Tech: Shellcode  (0) 2024.03.27
Tool: gdb & pwntools  (0) 2024.03.20
x86 Assembly  (0) 2024.03.19
Background: Linux Memory Layout  (0) 2024.03.19
Comments