Information Security Study

Computer Architecture 본문

Dreamhack/Reversing

Computer Architecture

gayeon_ 2023. 11. 23. 16:29

컴퓨터 구조

: 컴퓨터가 효율적으로 작동할 수 있도록 하드웨어 및 소프트웨어의 기능을 고안하고 이들을 구성하는 방법

 

- 컴퓨터의 기능 구조에 대한 설계, 명령어 집합구조, 마이크로 아키텍처, 그리고 기타 하드웨어 및 컴퓨팅 방법에 대한 설계 등이 포함

 

CPU의 명령어에 대한 설계 = 명령어 집합구조

- CPU가 처리해야 하는 명령어를 설계하는 분야

 

CPU의 하드웨어적 설계 = 마이크로 아키텍처

- 정의된 명령어 집합을 효율적으로 처리할 수 있도록 CPU의 회로를 설계하는 분야

 

 

컴퓨터 구조의 세부 분야

  • 기능 구조의 설계
    • 폰 노이만 구조
    • 하버드 구조
    • 수정된 하버드 구조
  • 명령어 집합구조
    • x86, x86-64
    • ARM
    • MIPS
    • AVR
  • 마이크로 아키텍처
    • 캐시 설계
    • 파이프라이닝
    • 슈퍼 스칼라
    • 분기 예측
    • 비순차적 명령어 처리
  • 하드웨어 및 컴퓨팅 방법론
    • 직접 메모리 접근

 

폰 노이만 구조

: 연산과 제어를 위해 중앙처리장치를, 저장을 위해 기억장치(memory), 그리고 장치간에 데이터나 제어 신호를 교환할 수 있도록 버스라는 전자 통로를 사용

 

중앙처리장치

- 프로그램의 연산을 처리하고 시스템을 제어

- 프로세스의 코드를 불러오고, 실행하고, 결과를 저장하는 일련의 모든 과정이 CPU에서 발생

 

CPU의 구성

- 산술/논리 연산을 처리하는 산술논리장치(Arithmetic Logic Unit, ALU)

- CPU를 제어하는 제어장치(Control Unit)

- CPU에 필요한 데이터를 저장하는 레지스터(Register) 등으로 구성

 

기억장치

- 기억장치는 컴퓨터가 동작하는데 필요한 여러 데이터를 저장하기 위해 사용

- 용도에 따라 주기억장치와 보조기억장치로 분류

- 주기억장치는 프로그램 실행과정에서 필요한 데이터들을 임시로 저장하기 위해 사용

  ex) 램(Random-Access Memory, RAM)

- 보조기억장치는 운영 체제, 프로그램 등과 같은 데이터를 장기간 보관하고자 할 때 사용

  ex) 하드 드라이브(Hard Disk Drive, HDD), SSD(Solid State Drive)

 

버스

- 버스는 컴퓨터 부품과 부품 사이 또는 컴퓨터와 컴퓨터 사이에 신호를 전송하는 통로

  ex) 데이터가 이동하는 데이터 버스(Data Bus), 주소를 지정하는 주소 버스(Address Bus), 읽기/쓰기를 제어하는 제어 버스(Control Bus)

- 이 외에도 랜선이나 데이터 전송을 목적으로 하는 소프트웨어, 프로토콜 등도 버스라고 불린다

 

주기억장치와 보조기억장치가 있는데 CPU 안에 다른 저장장치가 필요한 이유

CPU는 빠른 속도로 연산을 처리하기 위해 데이터의 빠른 교환이 필요하다.

주, 보조기억장치와의 데이터 교환 속도보다 CPU의 연산 속도가 압도적을 빠르기 때문에 이들만 사용하면 병목현상이 발생할 수 있다.

그래서 CPU는 데이터의 교환 속도를 단축하기 위해 레지스터, 캐시라는 저장장치를 내부에 갖고 있다.

 

명령어 집합 구조 (ISA)

: CPU가 해석하는 명령어의 집합을 의미

 

ISA는 IA-32 , x86-64(x64), MIPS, AVR 등 다양하게 존재한다.

-> 모든 컴퓨터가 동일한 수준의 연산 능력을 요구하지 않으며, 컴퓨팅 환경도 다양하기 때문이다.

 

x86-64는 고성능 프로세서를 설계하기 위해 사용된다.

-> 이를 기반으로한 CPU들은 많은 전력을 소모하며, 발열도 상대적으로 심하다.

-> 안정적으로 전력을 공급할 수 있고, 냉각 장치를 구비하는데 공간상의 부담이 크지 않은 데스크톱 또는 랩톱에 적합하다.

그러나 드론과 같이 배터리를 사용하거나 공유기, 인공지능 스피커처럼 크기가 작은 임베디드 기기들은 이러한 제약조건을 해결하기 어렵다. 특히 스마트폰은 피부에 닿기 때문에 발열 문제에 민감하고, 배터리로 작동하므로 높은 전력을 안정적으로 공급하기 어렵다. 그래서 많은 임베디드 장비들은 전력 소모와 발열이 적은 ARM이나 MIPS 또는 AVR의 프로세서를 사용하고 있다.

 

 

 

x86-64 아키텍처

 

n 비트 아키텍처

WORD: CPU가 이해할 수 있는 데이터의 단위  

WORD의 크기는 CPU가 어떻게 설계됐느냐에 따라 달라진다. 예를 들어, 일반적인 32비트 아키텍처에서 ALU는 32비트까지 계산할 수 있으며, 레지스터의 용량 및 각종 버스들의 대역폭이 32비트이다. 따라서 이들로 구성된 CPU는 설계 상 32비트의 데이터까지만 처리할 수 있게 된다.

 

WORD가 크면 유리한 점

32비트 아키텍처의 CPU가 제공할 수 있는 가상메모리의 크기가 작기 때문에 현대의 PC는 대부분 64비트 아키텍처의 CPU를 사용한다.

가상메모리: CPU가 프로세스에게 제공하는 가상의 메모리 공간

 

32비트 아키텍처에서는 4,294,967,296바이트(=4기가 바이트)가 최대로 제공 가능한 가상메모리의 크기이다. 일상적으로 사용하기에는 적절할 수 있지만 많은 메모리 자원을 소모하는 전문 소프트웨어나 고사양의 게임 등을 실행할 때는 부족할 수 있다.

반면 64비트 아키텍처에서는 이론상 16엑사 바이트(=16,777,216 테라바이트)의 가상메모리를 제공할 수 있다. 이는 웬만해서는 완전한 사용이 불가능할 정도로 큰 크기이기 때문에, 가용한 메모리 자원이 부족해서 소프트웨어의 최고 성능을 낼 수 없다거나 소프트웨어의 실행이 불가능한 상황은 거의 발생하지 않는다.

 

x86-64 아키텍처: 레지스터

레지스터

: CPU의 내부 저장장치, CPU가 빠르게 접근해 사용할 수 있다.

: 산술 연산에 필요한 데이터를 저장, 주소 저장, 주소 참조 등 다양한 용도로 사용된다.

 

 x64 아키텍처에 존재하는 레지스터

- 범용 레지스터(General Register)

- 세그먼트 레지스터(Segment Register)

- 명령어 포인터 레지스터(Instruction Pointer Register, IP) 

- 플래그 레지스터(Flag Register)

 

범용 레지스터

: 주용도가 있으나 그 이외의 용도로도 사용될 수 있는 레지스터

 

x86-64에서 각각의 범용 레지스터는 8바이트를 저장할 수 있으며, 부호 없는 정수를 기준으로 2^64 - 1까지 나타낼 수 있다.

 

자주 쓰이는 범용 레지스터들의 주용도

rax (accumulator register) 함수의 반환 값
rbx (base register) x64에서는 주된 용도 없음
rcx (counter register) 반복문의 반복 횟수, 각종 연산의 시행 횟수
rdx (data register) x64에서는 주된 용도 없음
rsi (source index) 데이터를 옮길 때 원본을 가리키는 포인터
rdi (destination index) 데이터를 옮길 때 목적지를 가리키는 포인터
rsp (stack pointer) 사용중인 스택의 위치를 가리키는 포인터
rbp (stack base pointer) 스택의 바닥을 가리키는 포인터

 

 

세그먼트 레지스터

- cs

- ss

- ds

- es

- fs

- gs

각 레지스터의 크기는 16비트

 

cs, ds, ss 레지스터

- 코드 영역, 데이터, 스텍 메모리 영역을 가리킬 때 사용

 

나머지 레지스터

- 운영체제 별로 용도를 결정할 수 있도록 범용적인 용도로 사용

 

명령어 포인터 레지스터

: CPU가 어느 부분의 코드를 실행할지 가리킨다

 

x64 아키텍처의 명령어 레지스터: rip (크기는 5바이트)

 

플래그 레지스터

: 프로세서의 현재 상태를 저장하고 있는 레지스터

x64 아키텍처에서는 RFLAGS라고 불리는 64비트 크기의 플래그 레지스터가 존재

 

플래그 레지스터 종류

CF(Carry Flag) 부호 없는 수의 연산 결과가 비트의 범위를 넘을 경우 설정 됩니다.
ZF(Zero Flag) 연산의 결과가 0일 경우 설정 됩니다.
SF(Sign Flag) 연산의 결과가 음수일 경우 설정 됩니다.
OF(Overflow Flag) 부호 있는 수의 연산 결과가 비트 범위를 넘을 경우 설정 됩니다.

 

 

레지스터 호환

x86-64 아키텍처는 IA-32의 64비트 확장 아키텍처이다.

-> 호환 가능

 

 IA-32에서 CPU의 레지스터들의 크기는 32비트이며 명칭은 

eax, ebx, ecx, edx, esi, edi, esp, ebp이다.

이 레지스터들은 x86-64에서도 사용 가능하다.

 

 rax, rbx, rcx, rdx, rsi, rdi, rsp, rbp가 이들의 확장된 형태이다.

 eax, ebx 등은 확장된 레지스터의 하위 32비트를 가리킨다.

(eax는 rax의 하위 32비트를 의미)

 

ax, bx, cx, dx, si, di, sp, bp는 eax, ebxecxedx, esi, edi, esp ,ebp의 하위 16비트이다

'Dreamhack > Reversing' 카테고리의 다른 글

Static Analysis vs. Dynamic Analysis  (1) 2023.11.23
Binary  (0) 2023.09.24
Introduction: Reverse Engineering  (0) 2023.09.24
Reversing Basic Challenge #2  (0) 2023.08.16
Reversing Basic Challenge #1  (0) 2023.08.16