컴퓨터 구조(Computer Architecture)
- 컴퓨터가 효율적으로 작동할 수 있도록 하드웨어 및 소프트웨어의 기능을 고안하고, 이들을 구성하는 방법
- 기능 및 구조에 대한 설계, 명령어 집합구조, 마이크로 아키텍처, 기타 하드웨어 및 컴퓨팅 방법에 대한 설계 등 포함
- 폰 노이만 구조 / 하버드 구조 / 수정된 하버드 구조
명령어 집합구조(Instruction Set Architecture, ISA)
- 전체적인 컴퓨터 구조 중 특히 CPU가 사용하는 명령어와 관련된 설계
- 대표적으로 Intel의 x86-64 Architecture
- 그 외에도 ARM, MIPS, AVR 등
마이크로 아키텍처(Micro Architecture)
- 정의된 명령어 집합을 효율적으로 처리할 수 있도록 CPU의 회로를 설계하는 분야
- CPU의 하드웨어적 설계
- 캐시 설계 / 파이프라이닝 / 슈퍼 스칼라 / 분기 예측 / 비순차적 명령어 처리 등
폰 노이만 구조
폰 노이만 : oO(컴퓨터에는 연산, 제어, 저장의 세 가지 핵심 기능이 필요!)
근대의 컴퓨터는 연산과 제어를 위해 CPU를, 저장을 위해 memory를 사용함 + 장치 간 데이터나 제어 신호를 교환할 수 있도록 Bus라는 전자 통로 사용
중앙처리장치(Central Processing Unit, CPU)
- 프로그램의 연산을 처리하고 시스템을 제어하는 컴퓨터의 두뇌
- ALU(Arithmetic Logic Unit, 산술논리장치) / Register 등으로 구성됨
기억장치
- 동작에 필요한 여러 데이터를 저장하기 위해 사용됨
- 주기억장치 : 프로그램 실행과정에서 필요한 데이터들을 임시로 저장하기 위해 사용
RAM(Random-Access Memory)
- 보조기억장치 : 운영체제, 프로그램 등과 같은 데이터를 장기간 보관하고자 할 때 사용
HDD, SDD
버스
- 부품과 부품 사이, 컴퓨터와 컴퓨터 사이의 신호를 전송하는 통로
- Data Bus, Address Bus, Control Bus 등이 있음
- 랜선이나 데이터 전송을 목적으로 하는 SW, Protocol 등도 Bus라고 불림
명령어 집합 구조
Instruction Set Architecture, ISA
- CPU가 해석하는 명령어의 집합을 의미
- IA-32, x86-64, MIPS, AVR 등 다양하게 존재함
x86-64 Architecture
- x64 아키텍처 : 인텔의 64bit CPU 아키텍처
인텔의 32bit CPU 아키텍처인 IA-32를 64bit 환경에서 사용할 수 있도록 확장한 것
- 64와 32는 CPU가 한번에 처리할 수 있는 데이터의 크기
컴퓨터 과학에서는 이를 CPU가 이해할 수 있는 데이터의 단위라는 의미에서 WORD라고 표현함
- WORD의 크기는 CPU 설계 방식에 따라 달라짐
레지스터
- CPU 내부의 저장장치로, CPU가 빠르게 접근하여 사용 가능
- 산술 여산에 필요한 데이터를 저장하거나 주소를 저장, 참조하는 등 다양한 용도로 사용됨
- General Register, Segment Register, Instruction Pointer Register, Flag Register 등이 존재
범용 레지스터(General Register)
- 주 용도가 있으나, 그 외의 임의 용도로도 사용될 수 있는 레지스터
- x86-64에서 각각의 범용 레지스터는 8byte 저장 가능
- unsigned int 기준으로 2^64 - 1까지 나타낼 수 있음
- x64의 경우 r8~r15까지의 범용 레지스터가 더 존재함
세그먼트 레지스터(Segment Register)
- x64 아키텍처에는 cs, ss, ds, es, fs, gs의 6가지 세그먼트 레지스터가 존재
- 각 레지스터의 크기는 16bit
- 과거에는 세그먼트 레지스터를 이용하여 물리 메모리의 크기를 키우려고 했음
ex) cs:offset에서 cs << 4 + offset의 주소를 사용하여 16bit 범위에서 접근할 수 없는 주소에 접근 가능했음
-> 요즘에 이런 용도로는 거의 사용하지 않음(넓어져서)
- 현대에서는 cs(코드 영역), ds(데이터 영역), ss(스택 메모리 영역) 으로 사용됨
명령어 포인터 레지스터(Instruction Pointer Register, IP)
- CPU가 어느 부분의 코드를 실행할 지 가리키는 역할
- x64 아키텍처의 명령어 레지스터는 rip, 크기는 8byte
플래그 레지스터(Flag Register)
- 프로세스의 현재 상태를 저장하고 있는 레지스터
- x64 아키텍처의 경우 RFLAGS라고 불리는 플래그 레지스터가 존재함(과거 16비트 플래그 레지스터가 확장된 것)
ex)
a = 3, b = 5일 때, a - b의 결과는 음수이므로 SF가 설정됨
CPU는 SF를 통해 a가 b보다 작았음을 알 수 있음
Quiz .
rax = 0x0123456789abcdef 일 때, eax, ax, ah, al의 값은?
정답 : eax = 0x89abcdef, ax = 0xcdef, ah = 0xcd, al = 0xef
풀이 : eax는 rax의 하위 32비트, ax는 eax의 하위 16비트, ah는 ax의 상위 8비트, al은 ax의 하위 8비트를 각각 의미함
rax에서 rbx를 뺐을 때, ZF가 설정되었다. rax와 rbx의 대소를 비교하시오
정답 : rax = rbx
풀이 : ZF(zero flag)는 연산의 결과가 0이 되었을 때 설정되는 플래그로, ZF가 0이 되었다면 두 피연산자의 값이 동일함(==)을 의미한다.
'INTERLUDE ✦ > 2023 Reversing STUDY' 카테고리의 다른 글
[ 악성코드 ] PreLab4 (0) | 2023.10.19 |
---|---|
[ SqureCTF ] Gates of Hell 1, 2 (0) | 2023.09.21 |
[ INTERLUDE ] Reversing 강의 영상 (0) | 2023.09.17 |
[ Dreamhack ] Reverse Engineering 1 (0) | 2023.09.14 |
[ Dreamhack - Reversing ] Small Counter (0) | 2023.08.21 |