Iriton's log
Background: Computer Architecture 본문
*본 포스트는 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 |