[시스템 해킹] 02. Computer Science-Computer Architecture

2024. 1. 28. 00:55시스템 해킹

컴퓨터 구조 Computer Architecture

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

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

 

 

명령어 집합구조 Instruction Set Architecture

; CPU의 명령어에 대한 설계. 

 

마이크로 아키텍처 Micro Architecture

;CPU의 하드웨어적 설계. CPU 회로 설계.

 


폰 노이만 구조

; (연산, 제어)->CPU + (저장)->기억장치. 장치간에 데이터나 제어 신호를 교환할 수 있도록 버스라는 전자 통로 사용.

폰 노이만 구조

중앙처리장치 CPU

; 연산을 처리하고 시스템을 관리하는 컴퓨터의 두뇌.

-산술/논리 연산을 처리하는 산술논리장치, CPU를 제어하는 제어장치, CPU에 필요한 데이터를 저장하는 레지스터

 

주기억장치

; 프로그램 실행과정에서 필요한 데이터들을 임시로 저장하기 위함. 

-RAM

 

보조기억장치

; 운영 체제, 프로그램 등과 같은 데이터를 장기간 보관하기 위함.

-HDD, SSD

 

버스

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

-데이터 버스(데이터 이동), 주소 버스(주소 지정), 제어 버스(읽기/쓰기 제어), 랜선, 데이터전송 SW, 프로토콜 등

 


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

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

- IA-32, x86-64(x64), MIPS, AVR 등

*다양한 컴퓨팅 환경, 다양한 ISA.


x86-64 아키텍처

; 대다수 개인용 컴퓨터는 이 아키텍처 기반의 CPU 탑재.

*x86-64의 여러 이름: Intel64, IA-32e, amd64, EM64T …

 

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

; CPU가 데이터를 빠르게 저장하고 사용할 때 이용하는 보관소

- 범용 레지스터(General Register); 주용도는 있으나 다양한 용도로 사용될 수 있는 레지스터

-세그먼트 레지스터(Segment Register); cs, ss, ds, es, fs, gs 총 6가지 존재. 각 크기는 16비트. x64로 아키텍처가 확장되면서 용도에 큰 변화가 생긴 레지스터.

*현대의 x64에서 cs, ds, ss 레지스터는 코드 영역과 데이터, 스택 메모리 영역을 가리킬 때 사용.

*나머지 레지스터는 운영체제 별로 용도를 결정할 수 있도록 범용적인 용도로 제작됨.

 

-명령어 포인터 레지스터(Instruction Pointer Register, IP); CPU가 프로그램의 어느 부분의 코드를 실행할지 가리키기 위함. rip 크기 8바이트

 

-플래그 레지스터(Flag Register); 프로세서의 현재 상태를 저장하고 있는 레지스터. RFLAGS 크기 64비트. 자신을 구성하는 여러 비트들로 CPU의 현재 상태를 표현.

64개 사용가능하지만 실제로는 20여개만 사용함.
A=3  B=5  A-B=SF -> SF를 통해 CPU는 A<B를 알수있음.

 

 

레지스터 호환

;  x86-64 아키텍처는 IA-32의 64비트 확장 아키텍처. IA-32에서 CPU의 레지스터들은 32비트 크기를 가지며, 이들의 명칭은 각각 eax, ebx, ecx, edx, esi, edi, esp, ebp. 호환성을 위해 이 레지스터들은 x86-64에서도 그대로 사용가능.

rax, rbx, rcx, rdx, rsi, rdi, rsp, rbp가 이들의 확장된 형태

eax, ebx 등은 확장된 레지스터의 하위 32비트(ex. eax는 rax의 하위 32비트)

* 마찬가지로 과거 16비트 아키텍처인 IA-16과의 호환을 위해 ax, bx, cx, dx, si, di, sp, bp eax, ebx , ecx , edx, esi, edi, esp, ebp의 하위 16비트를 가리킴.


rax = 0x0123456789abcdef 일 때, eax의 값은?  0x89abcdef

rax = 0x0123456789abcdef 일 때, ax의 값은?  0xcdef

rax = 0x0123456789abcdef 일 때, ah의 값은?  0xcd

rax = 0x0123456789abcdef 일 때, al의 값은?  0xef