Hacking/DreamHack 시스템 해킹 강의

[Dreamhack] Computer Architecture

미역줄기줄기 2024. 2. 3. 12:13
728x90

Background: Computer Architecture

서론

CPU가 사용하는 명령어와 관련된 설계를 명령어 집합구소(Instruction Set Architecture, ISA)라고 한다.

그 중 가장 널리 사용되는 ISA 중 하나가 x86-64 아키텍쳐이다.

 


컴퓨터 구조 💻

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

 

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

컴퓨터의 기능 구조에 대한 설계 명령어 집합구조 마이크로 아키텍처 하드웨어 및 컴퓨터 방법론
효율적인 연산을 위한 기능을 설계하는 분야

폰 노이만 구조
하버드 구조
수정된 하버드 구조
CPU가 처리해야하는 명령어를 설계

x86, x86-64
ARM
MIPS
AVR
CPU의 하드웨어적 설계. 정의된 명령어 집합을 효율적으로 처리할 수 있도록 함

캐시 설계
파이프라이닝
분기예측
비순차적 명령어 처리
직접 메모리 접근

 

 

 


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

레지스터는 CPU가 데이터를 빠르게 저장하고 사용할 때 이용하는 보관소이다. 산술 연산에 필요한 데이터 저장이나 주소를 저장하고 참조하는 등의 용도로 사용된다.

 

x64 아키텍처에는 범용 레지스터, 세그먼트 레지스터, 명령어 포인터 레지스터, 플래그 레지스터가 존재한다

 

범용 레지스터( 디스어셈블 하다보면 보였던게 범용레지스터 구나!!!!)

이름(64bit) 이름(32bit) 용도
rax eax 함수의 반환 값
rcx ecx 반복문의 반복 횟수, 각종 연산의 시행 횟수
rsi esi 데이터를 옮길 때 원본을 가리키는 포인터
rdi edi 데이터를 옮길 때 목적지를 가리키는 포인터
rsp esp 사용중인 스택의 위치를 가리키는 포인터
rbp ebp 스택의 바닥을 가리키는 포인터

(디스어셈블 하며 자주 보고 기억에 남는 레지스터는 굵은 글씨로 표시했다 반가운마음에 ㅎㅎ)

자주봐서 눈에 익혀두면 디스어셈블 할 때도 도움이 될 것 같다.

 

 

세그먼트 레지스터

x64 아키텍처에는 cs, ss, ds, es, fs, gs 총 6개의 세그먼트 레지스터가 존재한다. 각 레지스터의 크기는 16bit이다.

현재 cs, ds, ss 레지스터는 코드 영역과 데이터, 스택 메모리 영역을 가리킬 때 사용되고 나머지는 운영체제가 용도를 결정한다.

 

 

 

명령어 포인터 레지스터

CPU가 어느 부분의 코드를  실행하지 가리킨다. x64 아키텍처의 명령어 레지스터는 rip이며 크기는 8bit이다.

 

 

 

플래그 레지스터(이건 처음 들어본다..)

프로세서의 현재 상태를 저장하고 있는 레지스터이다. x64아키텍처에선 RFLAGS라고 불리는 64bit 크기의 플래그 레지스터가 존재한다.

 

플래그 의미
CF 부호 없는 수의 연산 결과가 비트의 범위를 넘을 경우 설정 된다
ZF 연사의 결과가 0일 경우 설정 된다
SF 연산의 결과가 음수일 경우 설정 된다
OF 부호 있는 수의 연산 결과가 비트 범위를 넘을 경우 설정 된다

 

 

 

 

 


Quiz

rax = 0x123456789abcdef 일 때, al은??

rax는 64비트 레지스터이며 al은 rax의 하위 8비트를 나타낸다. 0x123456789abcdef 에서 가장 낮은 8비트는 오른쪽부터 2자리인 0xef 이다!! 2자리인 이유는 8비트는 16진수로 표현될 때 두 자리 수이기 때문!

 

 rax = 0x0123456789abcdef 일 때, ah의 값은?

ah는 ax의 상위 8비트를 나타낸다. 따라서 ax는 rax의 하위 16비트를 나타낸다 즉 오른쪽에서부터 4자리! 0xcdef 그럼 ah는 0xcdef의 외쪽에서 2자리! 0xcd

 

rax = 0x0123456789abcdef 일 때, eax의 값은?

eax는 rax의 하위 32비트!! 0x123456789abcdef 에서 오른쪽부터 8자리! 0x89abcdef

 

rax = 0x0123456789abcdef 일 때, ax의 값은?

ax는 위에서 구했다~ rax의 하위 16비트 즉 오른쪽에서 4자리! 0xcdef

 

 

헷갈린다 복습 무조건 해야겠다