[들어가기 전 참고]
#CPU의 구성
1. ALU (Arithmetic Logic Unit) + CU(Control Unit)
2. Register
3. Cashe
#ISA(명령어 집합 구조)
- IA-32 ( 인텔의 32Bit Cpu 아키텍쳐)
- x86-64 (인텔의 64Bit Cpu 아키텍쳐)
- 32bit vs 64bit
- 32bit는 2**32 = 4기가 바이트, 64bit는 2**64 = 엄청 큰수 를 프로그램을 실행할때 제공할 수 있습니다. 가령 자신의 PC에 메모리가 커도 32bit 운영체제로 컴파일 할 경우 최대 4GB의 RAM을 사용 가능한것이죠.
그럼 왜 32Bit 아키텍쳐로 컴파일 하는 경우가 존재하는 것일까요?
- 임베디드 장비같이 가용 메모리 자원이 극한으로 적은 경우 64Bit 아키텍쳐를 사용하는 것이 아닌, 다른 CPU아키텍쳐 를 사용하는 것이 좋음으로, 하드웨어 자원에 따라 아키텍쳐를 사용한다고 보면 될 것같습니다.
0. 레지스터란 무엇인가요?
레지스터란 CPU에 필요한 데이터를 저장하는 공간을 말합니다. 메모리에서 값을 받아와 저장하고, CPU에게 전달하는 역할을 합니다. 저번 글에는 CPU는 메모리와 동작하며 연산을 진행한다는 것을 알려드렸습니다. ( 안봤으면 시스템 101을 참고해주시기 바랍니다 ) CPU는 매우 빠른 속도로 연산하는데 왜 레지스터가 필요하죠? 라고 하실 수 있지만 레지스터가 없다면 CPU는 빠르지만 데이터가 이동하는 속도가 느려 메모리에서 바로 값을 받아와 빠른 속도로 연산할 수가 없습니다.
1. 레지스터의 종류
1. 범용 레지스터
범용 레지스터는 각각의 주용도가 존재하지만 그 외에 다양한 용도로 사용될 수 있는 레지스터입니다. 하지만 거의 주용도로 사용되는 레지스터들이 있음으로(rax, rsp, rbp) 외워두는 것이 매우 좋습니다. x86-64에서 각각의 범용 레지스터는 8바이트를 저장할 수 있습니다.
레지스터 이름 | 주용도 |
rax (eax) accmulator - 축적 | 함수의 반환 값 저장 |
rbx (ebx) base | 주된 용도 없음 |
rcx (ecx) counter | 반복문의 반복 횟수, 연산의 시행 횟수 저장 |
rdx (edx) data | 주된 용도 없음. |
rsi (esi) source | 데이터를 옮길때 원본을 가르키는 포인터 |
rdi (edi) destination | 데이터를 옮길 때 목적지를 가르키는 포인터 |
rsp (esp) stack pointer | 사용중인 스택의 상단을 가르킨다 |
rbp (ebp) stack base pointer | 스택의 바닥을 가르킨다 |
r8 ~ r15 | 범용 레지스터 |
2. 세그먼트 레지스터
x64 아키텍처에는 cs, ss, ds, es, fs, gs 총 6가지 세그먼트 레지스터가 존재하고, 각 레지스터의 크기는 16비트입니다
cs, ds, ss 레지스터는 코드 영역과 데이터, 스택 메모리 영역을 가리킬 때 사용되고, 나머지 레지스터는 운영체제 별로 용도를 결정할 수 있도록 범용적인 용도로 제작된 세그먼트 레지스터입니다.
plus) 세그먼트 레지스터 in 32bit 아키텍쳐
과거에 32bit 아키텍쳐에서는 해당 세그먼트 레지스터를 이용하여 범위를 벗어난 메모리 주소를 가르키는데 사용되었습니다.
3. 명령어 포인터 레지스터 (rip, eip)
프로그램이 실행될 위치를 가르키며, 64아키텍쳐에서 크기는 8바이트입니다. 추후에 리버싱을 하다보면 rip가 무엇인지 조금 더 잘 알게될 것입니다.
4. 플래그 레지스터
프로세서의 현재 상태를 저장하고 있습니다. x64bit 아키텍쳐에는 RFLAGS라고 불리는 64bit 크기의 플래그 레지스터가 존재하며, 플래그 레지스터의 bit 상태로 현재 프로세스가 어떤 상태인지 알 수 있습니다.
주로 보게 될 플래그 레지스터입니다.
플래그 이름 | 의미 |
CF( Carry Flag ) | 부호 없는 수의 연산 결과가 할당된 비트의 범위를 넘을 경우 설정 |
OF ( Overflow Flag ) | 부호 있는 수의 연산 결과가 할당된 비트의 범위를 넘을 경우 설정 |
SF ( Sign Flag ) | 연산의 결과가 음수일 경우 1로 설정 그외는 0 |
ZF ( Zero Flag ) | 연산의 결과가 0일경우 1로 설정됨 그 외는 0 |
이와 같이 각각 조건에 맞는 상태가 발생하면 해당 bit (000010000000~00) 인 식으로 할당이 되고, 프로세스의 상태를 표시하게 됩니다.
2. 32bit 레지스터와 64bit 레지스터의 호환
범용 레지스터를 설명할때 앞자리가 r인것과 e로 시작하는걸 같이 적어놓은걸 보셨을껍니다. x64 아키텍쳐에서는 32bit 아키텍쳐를 지원합니다. rax = 8byte = 64bit 입니다. 이중 eax는 하위 32bit를 가르킵니다. 또한 16bit 아키텍쳐를 지원하기 위해 이중 하위 16bit는 AH라고 합니다. 자세한 정보는 구글링을 추천드립니다. 이 정보들이 또 상위 8bit, 하위8 bit로 나뉘기도 합니다.
※ 쉽게 이해하기
64bit | 32bit | 16bit |
rax | eax ( r이 e로 ) | ax ( e가 없어짐 ) |
rbx | ebx ( r이 e로 ) | bx ( e가 없어짐 ) |
여기까지 레지스터에 대해서 알아봤습니다.

'System 관련 CS > 시스템 해킹을 위한 기초 지식' 카테고리의 다른 글
[ 시스템 106 ] pwngdb 사용법, gdb 명령어 정리 및 예시 (0) | 2023.08.01 |
---|---|
[ 시스템 105 ] 실행파일의 종류 (PE파일, ELF파일)를 알아보고 gdb, pwndbg 플러그인 설치해보자 (0) | 2023.08.01 |
[시스템 104] System Call (시스템 콜) (0) | 2022.09.07 |
[시스템 103] x86-64 어샘블리 기초지식 ( x86-64 assembly ) (0) | 2022.09.06 |
[시스템 101] Process Memory 프로세스 메모리 분석 (0) | 2022.09.05 |