-
dreamhack stage 2 - Computer Architecture보안/SYSTEM HACKING 2024. 3. 15. 11:44
STAGE 2
Computer Architecture
Background: Computer Architecture
0. 서론
- 컴퓨터 구조, 명령어 집합 구조, 인텔의 x86-64에 대해 알아볼 예정
- 컴퓨터 과학을 배워야 하는 이유
시스템 해킹의 기술은 컴퓨터 과학에 뿌리를 두고 있다.
- 컴퓨터는 여러 부품의 도움으로 작동한다.
CPU: 컴퓨터의 작동에 핵심이 되는 연산 처리
저장장치: 데이터를 저장
GPU: 그래픽 데이터
랜카드: 네트워크 통신
사운드 카드: 소리 데이터 처리 ...
--> 서로 다른 부품이 모여 기계가 작동하게 하는 것은 기본 설계가 존재하기 때문이다.
여기에서 설계를 컴퓨터 구조(Computer Architecture) 라고 한다.
- 명령어 집합구조(Instruction Set Architecture, ISA)
: CPU 가 사용하는 명령어와 관련된 설계
대표적인 ISA: 인텔의 x86-64 아키텍쳐
1. 컴퓨터 구조와 명령어 집합 구조
- 컴퓨터 구조(Computer Architecture)
: 컴퓨터가 효율적으로 작동할 수 있도록 하드웨어 및 소프트웨어의 기능을 고안하고 구성하는 방법
- 포함되는 것들:
컴퓨터의 기능 구조에 대한 설계
: 컴퓨터가 연산을 효율적으로 하기 위해 어떤 기능이 컴퓨터에 필요한지 고민하고 설계하는 분야
대표적인 구조- 폰 노이만 구조, 하버드 구조, 수정된 하버드 구조
명령어 집합구조(Instruction Set Archiecture)
CPU의 명령에 대한 설계
: CPU가 처리해야하는 명령어를 설계하는 분야
대표적인 구조 - ARM, MIPS, AVR, 인텔의 x86, 인텔의 86-64
마이크로 아키텍쳐(Micro Architecture)
CPU의 하드웨어적 설계
: 정의된 명령어 집합을 효율적으로 처리할 수 있도록 CPU의 회로를 설계하는 분야
- 기능 구조의 설계 - 폰 노이만 구조
폰 노이만은 컴퓨터에 연산, 제어, 저장 이라는 핵심 기능이 필요하다고 생각했다.
근대의 컴퓨터는 연산과 제어를 위해 중앙처리장치(CPU), 저장을 위해 기억장치(memory),
장치 간에 데이터나 제어 신호를 교환할 수 있도록 버스(bus)라는 전자 통로를 사용한다.
- 중앙처리장치(CPU)
: 프로그램의 연산을 처리하고 시스템을 관리하는 컴퓨터의 두뇌
CPU에서 일어나는 일: 프로세스의 코드 불러오기, 실행하기, 결과를 저장하는 과정
CPU의 구성: 산술논리장치(Arithmetic Logic Unit, ALU) - 산술/논리 연산 처리
제어장치(Control Unit): CPU를 제어하는 장치
레지스터(Register): CPU에 필요한 데이터를 저장
등으로 구성된다.
- 기억장치(memory)
: 컴퓨터가 동작하는데 필요한 여러 데이터를 저장하기 위해 사용
용도에 따라 주기억장치 : 프로그램 실행과정에서 필요한 데이터를 임시로 저장하기 위해 사용
대표적: 램(Random-Access Memory, RAM)
보조기억장치: 운영체제, 프로그램 등과 같은 데이터를 장기간 보관하기 위해 사용
대표적: 하드 드라이브(Hard Disk Drive, HDD), SSD(Solid State Drive)
- 버스
: 컴퓨터 부품과 부품 사이/ 컴퓨터와 컴퓨터 사이에 신호를 전송하는 통로
랜선이나 데이터 전송 소프트웨어, 프로토콜 등도 버스라고 한다.
대표적: 데이터 버스(Data Bus) - 데이터가 이동
주소 버스 (Address Bus) - 주소를 지정
제어 버스 (Control Bus) - 읽기/쓰기 제어
+ CPU 안에 레지스터가 있는 이유: 필요한 데이터를 빠르게 공급하고 반출해야 효율을 제대로 발휘할 수 있다.
CPU의 연산속도가 기억장치와의 데이터 교환속도보다 너무 빨라서 기억장치만
사용하면 병목현상이 발생한다. 따라서 CPU는 교환속도를 획기적으로
단축하기 위해 레지스터와 캐시라는 저장장치를 가지고 있다.
- 명령어 집합 구조 (Instruction Set Architecture, ISA)
: CPU가 해석하는 명령어의 집합
프로그램은 기계어로 이루어져있고 프로그램을 실행하면 CPU가 명령어를 읽고 처리한다.
- 다양한 ISA가 존재하는데, 이는 컴퓨팅 환경이 다양하고 컴퓨터의 연산 능력이 다르기 때문이다.
ex. 인텔의 x86-64: 고성능 프로세서를 설계하기 위해 사용된다. 따라서 데스크톱, 랩톱에 적합하고
임베디드 기기에게는 적합하지 않다. 임베디드 장비들은 전력 소모와 발열이 적은 ARM/ MIPS/ AVR
프로세서를 사용한다.
- 여기에서는 x86-64를 대상으로 한다. x86기반 CPU점유율이 압도적이기 때문이다.
2. x86-64 아키텍처
: 인텔의 64비트 CPU 아키텍처
- 인텔의 32비트 CPU 아키텍처인 IA-32를 64비트 환경에서 사용할 수 있도록 확장함
- 대다수의 컴퓨터가 인텔의 x64 CPU 사용
- n 비트 아키텍처
- **비트 아키텍처에서의 숫자는 CPU가 한번에 처리할 수 있는 데이터의 크기이다.
- WORD: CPU가 이해할 수 있는 데이터의 단위
- WORD의 크기는 CPU의 설계에 따라 달라진다. ex. 32비트 아키텍처: 32비트까지 계산 가능..
- WORD가 크면 유리한 점: 가용한 메모리 자원이 부족해서 소프트웨어의 최고 성능을 낼 수 없거나
소프트웨어의 실행이 불가능한 상황이 거의 발생하지 않기 때문이다.\
+ x86-64가 여러 이름을 가진 이유는 개발 역사가 복잡하기 때문이다. amd64라는 명칭은 x86-64와 같은 아키텍처라고 생각해도 괜찮다.
- x86-64 아키텍처: 레지스터
레지스터: CPU가 데이터를 빠르게 저장하고 사용할 때 이용하는 보관소
- 용도: 산술 연산에 필요한 데이터 저장, 주소 저장, 참조 등의 용도
x64 아키텍처에는 범용 레지스터, 세그먼트 레지스터, 명령어 포인터 레지스터, 플래그 레지스터가 존재한다.
- 범용 레지스터 (General Register)
: 주용도는 있지만 다양한 용도로 사용될 수 있는 레지스터
x86-64에서 각각의 범용 레지스터는 8바이트 저장 가능, 부호 없는 정수 기준 2^64-1까지의 수 나타낼 수
있음.
- 세그먼트 레지스터 (Segment Register)
x64 아키텍처: cs, ss, ds, fs, gs 세그먼트 레지스터 존재, 각각 크기는 16비트
아키텍처가 확장되면서 용도에 큰 변화가 생긴 레지스터
과거: IA-32, IA-16 - 사용가능한 물리 메모리의 크기를 키우려고 했음
범용 레지스터의 크기가 작아 사용 가능한 메모리 주소 폭 좁음
현대: x64 - 사용 가능한 주소 영역이 넓음
cs, ss, ds 레지스터: 코드영역, 데이터, 스택 메모리 영역 가리킬 때 사용
나머지: 운영체제 별로 용도를 결정할 수 있도록 범용적인 용도로 제작된 세그먼트 레지스터
- 명령어 포인터 레지스터 ( Instruction Pointer Register, IP )
: CPU가 어느 부분의 코드를 실행할지 가리킨다.
x64 아키텍처의 명령어 레지스터: rip, 크기 8바이트
- 플래그 레지스터 ( Flag Register )
: 프로세서의 현재 상태를 저장하고 있는 레지스터
x64 아키텍처: RFLAGS 라는 64비트의 플래그 레지스터 존재한다.
최대 64개의 플래그 사용 가능하지만 20여개만 사용하고 16비트 플래그 레지스터가 확장된 것이다.
자신을 구성하는 비트로 CPU의 현재 상태를 표현한다.
- 레지스터 호환
IA-32에서는 CPU의 레지스터들이 32비트의 크기이고 각각 명칭이 eax, ebx, ecx, edx, esi, edi, esp, ebp
호환성을 위해 모두 x86-64에서도 사용 가능하다.
rax, rbx, rcx, rdx, rsi, rdi, rsp, rbp가 확장된 형태이다.
+ eax는 rax의 하위 32비트를 나타낸다 -> eax, ebx 등은 확장된 레지스터의 하위 32비트
+ IA-16과의 호환을 위해 ax, bx, cx, dx, si, di, sp, bp는 eax, ebx, ecx, edx, esi, edi, esp, ebp의 하위 16비트를 가리킨다.
3. 결론
범용 레지스터(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가 있다.
STAGE 2
Quiz: Computer Architecture
'보안 > SYSTEM HACKING' 카테고리의 다른 글
dreamhack stage 3 - Tool:pwntools (0) 2024.03.15 dreamhack stage 3 - Tool:gdb (0) 2024.03.15 dreamhack stage 2 - x86 Assembly (0) 2024.03.15 dreamhack stage 2 - Linux Memory Layout (0) 2024.03.15 dreamhack stage 1 - System Hacking Introduction (0) 2024.03.13