Dreamhack

리버싱 03 - 컴퓨터 구조, 명령어 집합 구조

kchabin 2022. 7. 10. 15:35

* 모든 내용과 이미지 출처는 Background: Computer Architecture | Dreamhack

 

로그인 | Dreamhack

 

dreamhack.io

CPU : 컴퓨터 작동의 핵심이 되는 연산 처리. 

저장장치 : 데이터 저장

GPU : 그래픽 데이터 처리

랜카드 : 네트워크 통신 처리

사운드 카드 : 소리 데이터 처리

 

컴퓨터 구조(Computer Architecture) 

컴퓨터의 기본 설계. 서로 다른 부품들이 이 설계에 맞춰서 개발되고 조립되어 컴퓨터가 완성됨.

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

 

명령어 집합구조(Instruction Set Architecture, ISA)

CPU가 사용하는 명령어와 관련된 설계

인텔 x86-64 아키텍처 = 가장 널리 사용되는 ISA 중 하나.

 

세부 분야

기능 구조의 설계

  폰 노이만 구조

  하버드 구조

  수정된 하버드 구조

 

명령어 집합구조

  x86, x86-64

  ARM

  MIPS

  AVR

 

- 마이크로 아키텍처

  캐시 설계

  파이프라이닝

  슈퍼 스칼라

  분기 예측

  비순차적 명령어 처리

 

- 하드웨어 및 컴퓨팅 방법론

  직접 메모리 접근

 

폰 노이만 구조

컴퓨터에 연산, 제어, 저장의 세 가지 핵심 기능이 필요하다. - 노이만

 

+ 중앙처리장치(Central Processing Unit, CPU) -> 연산과 제어

CPU = 컴퓨터의 두뇌 

- 프로그램 연산 처리, 시스템 제어 

- 구성

 산술논리장치(Arithmetic Logic Unit, ALU) : 산술/논리 연산 처리

 제어장치(Control Unit) : CPU 제어

 레지스터(Register) : CPU에 필요한 데이터 저장

 

+ 기억장치(Memory) -> 저장

주기억장치 : 프로그램 실행과저에서 필요한 데이터 임시 저장.-> 램(Random-Access Memory, RAM)

보조기억장치 : 운영 체제, 프로그램 등과 같은 데이터 장기 보관 -> 하드드라이브(HDD), SSD(Solid State Drive)

 

+ 버스(bus) -> 장치 간 데이터 or 제어 신호 교환용 전자 통로.

컴퓨터 부품과 부품 사이 / 컴퓨터 간 신호 전송 통로. 

 

데이터 버스(Data Bus) : 데이터 이동

주소 버스(Address Bus) : 주소 지정

제어 버스(Control Bus) : 읽기/쓰기 제어

 

그 외) 랜선, 데이터 전송 목적 소프트웨어, 프로토콜 등

 

CPU에 저장장치가 필요한 이유 : CPU는 굉장히 빠른 속도로 연산을 처리하므로 데이터 교환속도를 주기억장치 및 보조기억장치가 따라가지 못함. -> 병목현상 발생 가능.

데이터 교환 속도 획기적 단축 목적 -> 레지스터와 캐시 존재

 

명령어 집합 구조

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

프로그램의 코드는 기계어로 작성되어 있고, 실행하면 이 명령어들을 CPU가 읽고 처리함.

 

인텔 x86-64 : 고성능 프로세서 설계용. 많은 전력 소비, 발열 -> 데스크톱, 랩탑에 적합함. 점유율 압도적임.

ARM, MIPS, AVR 사용 : 임베디드 기기, 스마트폰 등은 발열 문제에 민감하고, 배터리 작동으로 많은 전력 공급이 어려움.

 

x86-64 아키텍처

인텔의 64비트 CPU 아키텍처. 

 

- n 비트 아키텍처

64비트 아키텍처, 32비트 아키텍처

64, 32 = CPU가 한번에 처리 가능한 데이터의 크기 => WORD : CPU가 이해할 수 있는 데이터의 단위라는 의미.

 

32비트 아키텍처

ALU = 한번에 32비트 크기의 값 연산 가능

레지스터의 용량 및 각종 버스 대역폭 = 32비트 크기

-> 설계 상 32비트의 데이터까지만 처리 가능.

 

WORD가 크면 유리한 점

32비트 아키텍처는 가상메모리(Vitual Architecture) 크기가 작음.-> 전문 소프트웨어나 고사양 게임 돌리기엔 부족함.

 

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

레지스터 : CPU 내부 저장장치, 산술 연산에 필요한 데이터 저장 or 주소 저장하고 참조 등 다양한 용도.

 

범용 레지스터(General Register) 

주용도는 있는데 그 외 용도로도 사용 가능. 

8바이트 저장 가능.

부호 없는 정수 기준 2^64 -1 까지 나타낼 수 있음.

 

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

 

세그먼트 레지스터

cs, cc, ds, es, fs, gs -> 세그먼트 레지스터. 각각 16비트 크기. 

- x64로 아키텍처가 확장되면서 용도에 큰 변화가 생긴 레지스터. 

 

과거

IA-32, IA-16 : 세그먼트 레지스터를 이용해서 사용 가능한 물리 메모리의 크기를 키우려 함.

ex)  cs:offset -> 실제 주소 = cs<<4 + offset  

= 16비트에 범위에서 접근할 수 없는 주소 접근 가능. 

당시에는 범용 레지스터 크기 작았지만 지금 x64에서는 사용 가능한 주소 영역이 굉장히 넓기 때문에 이런 용도로는 거의 사용 x.

 

현대

cs, ds, ss 레지스터 : 코드 영역과 데이터, 스택 메모리 영역을 가리킬 때 사용됨. 

es, fs, gs : 운영체제 별로 용도 결정. -> 범용적 세그먼트 레지스터.

 

명령어 포인터 레지스터

프로그램의 기계어 코드 중 어느 부분의 코드를 실행할지 가리키는 역할.

rip, 크기 = 8바이트.

 

플래그 레지스터

프로세서의 현재 상태 저장. 

REFLAGS, 64비트 크기. 

깃발을 올리고 내리듯이 자신을 구성하는 여러 비트들로 CPU의 현재 상태 표현.

 

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

a=3, b=5일 때 a에서 b를 빼면 연산의 결과가 음수이므로 SF 설정. 

CPU는 SF를 통해 a가 b보다 작았음을 알 수 있음. 

-> 실제 이런 원리를 이용해 대소 비교하는 어셈블리 명령어가 있음.

 

레지스터 호환

x86-64 아키텍처는 IA-32의 64비트 확장 아키텍처임. 호환 가능.

IA-32 레지스터들 : eax, ebx, ecx, edx, esi, edi, edp, ebp -> 확장된 레지스터의 하위 32비트.

예) eax = rax의 하위 32비트

IA-16 레지스터 : ax, bx, cx, dx, si, di, sp bp -> IA-32의 하위 16비트를 가리킴

또 다시 상위 8비트와 하위 8비트로 나뉘기도 함.

 

rax -> eax -> ax 순으로 내려간다고 보면 됨. 

퀴즈 

rax = 0x0123456789abcdef 일 때, eax, ax, ah, al의 값.

1) eax = 0x89abcdef 

-> rax는 16바이트 즉, 64비트로 이루어짐. eax는 rax의 하위 32비트이므로 0123456789abcdef의 절반 중 뒷부분인 

0x89abcdef이다.

 

2) ax = 0xcdef

3) ah = 0xcd

4) al = 0xef

 

rax에서 rbx를 뻈을 때, ZF 설정 -> rax == rbx이다.

-> ZF= 제로 플래그. 연산의 결과가 0일 경우 설정됨.

'Dreamhack' 카테고리의 다른 글

리버싱 06 - rev-basic-0  (0) 2022.07.12
리버싱 05 - x86 Assembly  (0) 2022.07.12
리버싱 04 - Windows Memory Layout  (0) 2022.07.10
리버싱 02 - 동적 분석과 정적 분석  (0) 2022.07.10
리버싱 01 - Binary  (0) 2022.07.09