-
Background: Computer ArchitectureSystem - Security/Dreamhack - Basic 2023. 5. 17. 21:15
컴퓨터 구조와 명령어 집합 구조
컴퓨터 구조(Computer Architecture)
컴퓨터 구조란 컴퓨터가 효율적으로 작동할 수 있도록 하드웨어 및 소프트웨어의 기능을 고안하고, 이들을 구성하는 방법을 말한다
컴퓨터 구조는 컴퓨터의 기능 구조에 대한 설계, 명령어 집합구조, 마이크로 아키텍처, 그리고 기타 하드웨어 및 컴퓨팅 방법에 대한 설계 등이 포함된다
CPU의 명령어에 대한 설계는 명령어 집합구조(Instruction Set Architecture, ISA)라고 불리며, CPU가 처리해야 하는 명령어를 설계하는 분야이다
대표적으로 ARM, MIPS, AVR, 인텔의 x86 및 x86-64 등이 있다CPU의 하드웨어적 설계는 마이크로 아키텍처라고 불리며 정의된 명령어 집합을 효율적으로 처리할 수 있도록, CPU의 회로를 설계하는 분야이다
폰 노이만 구조
컴퓨터에 연산, 제어, 저장의 세 가지 핵심 기능이 필요하다고 생각
근대의 컴퓨터는 연산과 제어를 위해 중앙처리장치(Central Processing Unit, CPU)를, 저장을 위해 기억장치(memory)를 사용하고 장치 간에 데이터나 제어 신호를 교환할 수 있도록 버스(bus)라는 전자 통로를 사용한다
중앙처리장치
CPU는 프로그램의 연산을 처리하고 시스템을 관리하는 컴퓨터의 두뇌이다
CPU는 산술/논리 연산을 처리하는 산술논리장치(Arithmetic Logic Unit, ALU)와 CPU를 제어하는 제어장치(Control Unit), CPU에 필요한 데이터를 저장하는 레지스터(Register) 등으로 구성된다
Dreamhack - System Hacking 기억장치
기억장치는 컴퓨터가 동작하는데 필요한 여러 데이터를 저장하기 위해 사용한다
주기억장치는 프로그램 실행과정에서 필요한 데이터들을 임시로 저장하기 위해 사용하며 대표적으로 램(Random-Access Memory, RAM)이 있다
보조기억장치는 운영 체제, 프로그램 등과 같은 데이터를 장기간 보관하고자 할 때 사용하며 대표적으로 하드 드라이브(Hard Disk Drive, HDD), SSD(Solid State Drive)가 있다
버스
버스는 컴퓨터 부품과 부품 사이 또는 컴퓨터와 컴퓨터 사이에 신호를 전송하는 통로를 말한다
데이터가 이동하는 데이터 버스(Data Bus), 주소를 지정하는 주소 버스(Address Bus), 읽기/쓰기를 제어하는 제어 버스(Control Bus)가 있다
명령어 집합 구조
명령어 집합 구조(Instruction Set Architecture, ISA)란 CPU가 해석하는 명령어의 집합을 의미한다
프로그램은 기계어로 이루어져 있으며, 프로그램을 실행하면 이 명령어들을 CPU가 읽고, 처리한다ISA는 IA-32 , x86-64(x64), MIPS, AVR 등 다양하게 존재한다
다양한 ISA가 개발되고 사용되는 이유는 모든 컴퓨터가 동일한 수준의 연산 능력을 요구하지 않으며, 컴퓨팅 환경도 다양하기 때문이다x86-64 아키텍처
x64 아키텍처는 인텔의 64비트 CPU 아키텍처이다
인텔의 32비트 CPU 아키텍처인 IA-32를 64비트 환경에서 사용할 수 있도록 확장한 것이다n 비트 아키텍처
64비트 아키텍처, 32비트 아키텍처에서 64와 32는 CPU가 한번에 처리할 수 있는 데이터의 크기이다
이를 CPU가 이해할 수 있는 데이터의 단위라는 의미에서 WORD라고 부른다WORD의 크기는 CPU가 어떻게 설계됐느냐에 따라 달라진다
32비트 아키텍처에서 ALU는 32비트까지 계산할 수 있다WORD가 크면 유리한 점
현대의 PC는 대부분 64비트 아키텍처의 CPU를 사용하는데, 그 이유 중 하나는 32비트 아키텍처의 CPU가 제공할 수 있는 가상메모리의 크기가 작기 때문이다
32비트 아키텍처에서는 4,294,967,296바이트(=4기가 바이트)
64비트 아키텍처에서는 이론상 16엑사 바이트(=16,777,216 테라바이트)x86-64 아키텍처 : 레지스터
레지스터는 CPU가 데이터를 빠르게 저장하고 사용할 때 이용하는 보관소이다
산술 연산에 필요한 데이터를 저장하거나 주소를 저장하고 참조하는 등 다양한 용도로 사용된다범용 레지스터
범용 레지스터는 주용도는 있으나, 그 외의 다양한 용도로 사용될 수 있는 레지스터를 말한다
x86-64에서 각각의 범용 레지스터는 8바이트를 저장할 수 있으며, 부호 없는 정수를 기준으로 2^64 - 1까지의 수를 나타낼 수 있다rax (accumulator register) 함수의 반환 값 rbx (base register) x64에서는 주된 용도 없음 rcx (counter register) 반복문의 반복 횟수, 각종 연산의 시행 횟수 rdx (data register) x64에서는 주된 용도 없음 rdx (data register) 데이터를 옮길 때 원본을 가리키는 포인터 rdi (destination index) 데이터를 옮길 때 목적지를 가리키는 포인터 rsp (stack pointer) 사용중인 스택의 위치를 가리키는 포인터 rbp (stack base pointer) 스택의 바닥을 가리키는 포인터 세그먼트 레지스터
x64 아키텍처에는 cs, ss, ds, es, fs, gs 총 6가지 세그먼트 레지스터가 존재 각 레지스터의 크기는 16비트이다
세그먼트 레지스터는 x64로 아키텍처가 확장되면서 용도에 큰 변화가 생긴 레지스터이다과거 IA-32, IA-16에서는 세그먼트 레지스터를 이용하여 사용 가능한 물리 메모리의 크기를 키우려고 했다
예를 들어 IA-16에서는, 어떤 주소를 cs:offset라고 한다면, 실제로는 cs<<4 + offset의 주소를 사용하여 16비트 범위에서 접근할 수 없는 주소에 접근할 수 있었다현대의 x64에서 cs, ds, ss 레지스터는 코드 영역과 데이터, 스택 메모리 영역을 가리킬 때 사용되고, 나머지 레지스터는 운영체제 별로 용도를 결정할 수 있도록 범용적인 용도로 제작된 세그먼트 레지스터이다
명령어 포인터 레지스터
프로그램은 일련의 기계어 코드들로 이루어져 있다
이 중에서 CPU가 어느 부분의 코드를 실행할지 가리키는 게 명령어 포인터 레지스터의 역할이다x64 아키텍처의 명령어 레지스터는 rip이며, 크기는 8바이트이다
플래그 레지스터
플래그 레지스터는 프로세서의 현재 상태를 저장하고 있는 레지스터를 말한다
x64 아키텍처에서는 RFLAGS라고 불리는 64비트 크기의 플래그 레지스터가 존재하며, 과거 16비트 플래그 레지스터가 확장된 것이다플래그 레지스터는 자신을 구성하는 여러 비트들로 CPU의 현재 상태를 표현해 준다
Dreamhack - System Hacking RFLAGS는 64비트이므로 최대 64개의 플래그를 사용할 수 있지만, 실제로는 위의 20여 개의 비트만 사용한다
CF(Carry Flag) 부호 없는 수의 연산 결과가 비트의 범위를 넘을 경우 설정 ZF(Zero Flag) 연산의 결과가 0일 경우 설정 SF(Sign Flag) 연산의 결과가 음수일 경우 설정 OF(Overflow Flag) 부호 있는 수의 연산 결과가 비트 범위를 넘을 경우 설정 플래그를 사용하는 간단한 예로, 3의 값을 갖는 a와 5의 값을 갖는 b가 있을 때, a에서 b를 빼는 연산을 하면, 연산의 결과가 음수이므로 SF가 설정된다
그러면 CPU는 SF를 통해 a가 b보다 작았음을 알 수 있다레지스터 호환
IA-32에서 CPU의 레지스터들은 32비트 크기를 가지며, 이들의 명칭은 각각 eax, ebx, ecx, edx, esi, edi, esp, ebp였다
호환성을 위해 이 레지스터들은 x86-64에서도 그대로 사용이 가능하다Dreamhack - System Hacking rax, rbx, rcx, rdx, rsi, rdi, rsp, rbp가 이들의 확장된 형태이며, eax, ebx 등은 확장된 레지스터의 하위 32비트를 가리킨다
예를 들어, eax는 rax의 하위 32비트를 의미한다마찬가지로 과거 16비트 아키텍처인 IA-16과의 호환을 위해 ax, bx, cx, dx, si, di, sp, bp는 eax, ebx, ecx, edx, esi, edi, esp , ebp의 하위 16비트를 가리킨다
이들 중 몇몇은 다시 상위 8비트, 하위 8비트로 나뉜다
Dreamhack - System Hacking 공부내용 정리
자세한 설명과 관련된 문제는 사이트에 수록되어 있습니다
728x90'System - Security > Dreamhack - Basic' 카테고리의 다른 글
Linux Memory Layout (1) 2023.05.15