# SYSTEM HACKING
* 가상 머신 : 컴퓨터를 에뮬레이팅 한 것
가상 머신을 작동 시키는 컴퓨터를 호스트(Host)라고 부르며, 가상 머신 안에서 작동하는 컴퓨터를 게스트(Guest)라고 부릅니다. 가상 머신을 이용하면 호스트는 게스트에게 독립된 실행환경을 제공할 수 있습니다. 그 위에서 게스트는 윈도우, 리눅스, 맥 등의 운영체제를 구동할 수도 있고, 원하는 특정 프로그램만 실행할 수도 있습니다.
대표적인 가상화 소프트웨어로는 VMware, VirtualBox, Parallels, QEMU 등이 있습니다.
# COMPUTER ARCHITECTURE, 컴퓨터 구조
컴퓨터로서 작동할 수 있도록 하는 여러가지 부품에 대한 기본 설계
컴퓨터 구조 : 컴퓨터가 효율적으로 작동할 수 있도록 하드웨어 및 소프트웨어의 기능을 고안하고, 구성하는 방법
- 컴퓨터의 기능 구조에 대한 설계
- 컴퓨터가 연산을 효율적으로 하기 위해 필요한 기능을 고민하고, 설계
- ex) 폰 노이만 구조, 하버드 구조, 수정된 하버드 구조 ...
- 명령어 집합구조
- CPU의 명령어에 대한 설계
- ex) x86, x86-64, ARM, MIPS, AVR ...
- 마이크로 아키텍처
- CPU의 하드웨어적 설계
- 정의된 명령어 집합을 효율적으로 처리할 수 있도록 CPU의 회로를 설계
- ex) 캐시 설계, 파이프라이닝, 슈퍼 스칼라, 분기 예측, 비순차적 명령어 처리 ...
- 하드웨어 및 컴퓨팅 방법에 대한 설계
- 직접 메모리 접근
- 등등
+ 폰 노이만 구조
- 컴퓨터에 연산, 제어, 저장의 세가지 핵심 기능이 필요하다..!
> 연산과 제어를 하는 중앙처리장치(CPU, Central Processing Unit) + 저장을 하는 기억장치 (memory)
> 장치간에 데이터, 제어 신호를 교환할 수 있게 하는 전자통로, 버스 (bus)
- 중앙처리장치, CPU
- 프로그램의 연산을 처리하고 시스템을 관리
- 산술논리장치(ALU) : 산술/논리 연산을 처리
- 제어장치(Control Unit) : CPU를 제어
- 레지스터(Register) : CPU에 필요한 데이터를 저장
- 기억장치, memory
- 컴퓨터가 동작하는데 필요한 데이터를 저장
- 주기억장치
- 프로그램 실행과정에서 필요한 데이터를 임시로 저장하기 위해 사용
- ex) RAM ...
- 보조기억장치
- 운영체제, 프로그램 등과 같은 데이터를 장기관 보관할 때 사용
- ex) HDD(하드 드라이브), SSD ...
# 기억장치가 있음에도 CPU안에 레지스터가 필요한 이유
빠른 속도로 연산을 처리하는 CPU는 필요한 데이터를 빠르게 공급하고 반출할 수 있어야 효율적으로 작동할 수 있다.
이때 CPU의 연산 속도가 기억장치와 데이터 교환 속도보다 압도적으로 빠르기 때문에 기억장치만을 사용하면 병목현상이 발생하므로 이 교환 속도를 단축하기 위해 레지스터와 캐시를 저장장치 내부에 가진다.
- 버스, bus
- 컴퓨터 부품과 부품 사이, 컴퓨터와 컴퓨터 사이에 신호를 전송하는 통로
- 데이터 버스 (data bus) : 데이터가 이동
- 주소 버스 (address bus) : 주소를 지정하는 버스
- 제어 버스 (Control bus) : 읽기 / 쓰기를 제어
- 랜선, 데이터 전송 소프르웨어, 프로토콜 ...
# Instruction Set Architecture, ISA, 명렁어 집합구조
ISA : CPU가 사용하는 명령어와 관련된 설계
- 모든 컴퓨터가 동일한 수준의 연산 능력을 요구하지 않고, 컴퓨팅 환경도 다양하기 때문에 다양한 ISA가 존재한다.
- 랩탑, 데스트탑 -> x86-64 / 임베디드 장비 -> ARM, MIPS, AVR
# 인텔 x86-64
인텔 x86-64== intel 64 == amd64 == IA-32e ...
+ N 비트 아키텍처
- N : CPU가 한번에 처리할 수 있는 데이터의 크기 >> WORD : CPU가 이해할 수 있는 데이터의 단위
- N 비트 아키텍처에서 CPU는 N비트의 데이터까지만 처리할 수 있다.
+ x86-64 아키텍처의 레지스터
- CPU가 데이터를 빠르게 저장, 사용할 때 레지스터를 이용한다.
- 범용 레지스터 (in x86-64)
- 다양한 용도로 사용할 수 있는 레지스터
- 각각의 범용 레지스터는 8바이트를 저장할 수 있다. > (unsigned int) 2^64-1까지 표현
- 다양한 용도로 사용할 수 있는 레지스터
- 세그먼트 레지스터 (in x86-64)
- 6가지 세그먼트 레지스터 존재
- cs, ds, ss : 코드 영역과 데이터, 스택 메모리 영역을 가리킬 때 사용
- es, fs, gs : 운영체제 별로 용도를 결정할 수 있도록 범용적인 용도로 제작된 세그먼트 레지스터
- 명령어 포인터 레지스터 (in x86-64)
- CPU가 어느 부분의 코드를 실행할지 가리킨다.
- rip - 8byte
- 플래그 레지스터
- 프로세서의 현재 상태를 저장한다.
- 플래그 레지스터, 본인을 구성하는 여러 비트들로 CPU의 현재 상태를 표현
- RFLAGS - 64bit
- 자주 사용하는 플래그
- CF (carry flag)
- ZF (zero flag)
- SF (sign flag)
- OF (overflow flag)
- 레지스터 호환 : 32bit 아키텍처와 호환하고자 할 때 64비트의 레지스터를 반으로 나눠서 뒷부분을 계속해서 반으로 자르면서 비트를 나눈다. >> ex) rax(64) > EAX(32) > AH, AL(16) ...
[ 참조 ]
본 페이지는 드림핵(dreamhack.io)의 시스템 해킹 로드맵, STAGE2를 정리한 글입니다.
'about Security > 시스템 해킹' 카테고리의 다른 글
[드림핵] x86 Assembly (0) | 2022.03.26 |
---|---|
[드림핵] Linux Memory Layout (0) | 2022.03.26 |
댓글