Home [Study] Register
Post
Cancel

[Study] Register

레지스터란?


: 레지스터(register)는 CPU 내부에 존재하는 다목적 저장공간으로서, CPU가 요청을 처리하는데 필요한 데이터를 일시적으로 저장. 산술 연산에 필요한 데이터를 저장하거나 주소를 저장하고 참조하는 등 다양한 용도로 사용됨.

레지스터는 32bit 환경에서는 첫 글자가 E(Extended)로 시작하고, 64bit 환경에서는 첫 글자가 R(Regitster)로 시작하고 32bit의 레지스터를 포함합니다. ex) RAX


🔧 x86 환경(32bit)


범용 레지스터

: 범용 레지스터(General Register)는 주용도가 존재하지만, 다양한 용도로도 사용될 수 있는 레지스터. x86에서 각각의 범용 레지스터는 4byte(=32bit)를 저장할 수 있음. 각 레지스터는 비트의 하위호환과 공간의 낭비를 없애기 위해 구역이 나뉘어 존재함.


이름주용도
EAX(Accumulator)산술 연산 시 상수/변수 값 저장, 함수의 반환 값 지정
EBX(Base)메모리 주소를 저장. 산술이나 변수 저장에 사용되기도 함
ECX(Counter)반복문의 반복 횟수와 각종 연산의 시행 횟수로 사용되는 값 저장
EDX(Data)EAX의 확장 개념으로, 나눗셈/곱셈 명령 등에 사용. 범용 목적의 저장소로 사용하기도 함
🔽인덱스 레지스터 
ESI(Source index)데이터 조작/복사 시에 데이터의 주소를 가리키는 포인터
EDI(Destination index)데이터를 조작/복사 시에 목적지 주소를 가리키는 포인터
🔽포인터 레지스터 
ESP(Stack pointer)스택 프레임의 끝지점 주소를 가리키는 포인터
EBP(Stack base pointer)스택 프레임의 바닥(시작) 주소를 가리키는 포인터

앞글자의 E는 Extended를 의미


세그먼트 레지스터

: 세그먼트 레지스터(Segment Register)는 프로세스의 특정 세그먼트를 가리키는 포인터의 역할을 수행. 각 레지스터의 크기는 16bit.


이름주용도
CS(code segment)코드 영역의 시작 주소를 가리킴
DS(data segment)데이터 영역의 시작 주소를 가리킴
SS(stack segment)스택 영역의 시작 주소를 가리킴
ES(extra segment)추가적인 데이터 세그먼트로, 메모리 주소 지정을 다루는 스트링 연산에 사용
FS/GS(general purpose segment)추가적인 데이터 세그먼트로, 운영체제별로 용도를 결정할 수 있도록 범용적인 용도로 쓰임


명령어 포인터 레지스터

: 명령어 포인터 레지스터(Instruction Pointer)는 CPU가 어느 부분의 기계어 코드를 다음으로 실행할지 가리키는 역할을 함. x86 아키텍처의 명령어 레지스터는 EIP(Instruction pointer)이며, 크기는 32bit. CPU는 EIP에 저장된 메모리 주소가 가리키는 명령어를 하나 처리하고 현재 수행하는 명령어의 크기만큼 자동으로 크기를 증가시켜 다음 실행할 명령어 주소를 갖게 됨.


플래그 레지스터

: 플래그 레지스터(Flag Register)는 프로세서와 다양한 산술결과의 현재 상태를 저장하고 있는 레지스터. x86 아키텍처에서는 EFLAGS라고 불리는 32bit 크기의 플래그 레지스터가 존재함.


플래그의미
CF(Carry Flag)부호 없는 수의 연산 결과가 비트 범위를 넘으면 설정(1)
ZF(Zero Flag)연산의 결과가 0일 경우 설정(1)
SF(Sign Flag)연산의 결과가 음수일 경우 설정(1)
OF(Overflow Flag)부호 있는 수의 연산 결과가 비트 범위를 넘으면 설정(1)
AF(Auxiliary Carry Flag)보조 캐리 플래그로, 연산 결과가 하위 4비트를 넘으면 설정(1)
PF(Parity Flag)연산 결과가 1비트의 개수가 짝수인 경우 설정(1)
DF(Direction Flag)문자열 데이터를 이동시키거나 비교할 때 주소 레지스터가 설정(1)이면 감소, 반대는 감소
TF(Trap Flag)설정(1)인 경우 한 명령이 실행될 때마다 내부 인터럽트 발생. 디버깅에 사용
IF(Interrupt Flag)키보드 입력과 같은 외부 인터럽트가 처리/무시 되어야 하는지 나타냄


🔽 Flag Register

31302928272625242322212019181716151413121110987654321
0000000000IDVIPVIFACVMRF0NTIOPLOFDFIFTFSFZF0AF0PF1CF


🔧 x64 환경(64bit)


범용 레지스터

: x64에서 각각의 범용 레지스터는 8byte(=64bit)를 저장할 수 있음. 각 레지스터는 bit의 하위호환과 공간의 낭비를 없애기 위해 구역이 나뉘어 존재함.


이름주용도
RAX(Accumulator)산술 연산 시 상수/변수 값 저장, 함수의 반환 값 지정
RBX(Base)x64에서는 주된 용도 없음
RCX(Counter)반복문의 반복 횟수와 각종 연산의 시행 횟수로 사용되는 값 저장
RDX(Data)x64에서는 주된 용도 없음
RSI(Source index)데이터 조작/복사 시에 원본을 가리키는 포인터
RDI(Destination index)데이터를 조작/복사 시에 목적지를 가리키는 포인터
RSP(Stack pointer)스택 프레임의 끝지점 주소를 가리키는 포인터
RBP(Stack base pointer)스택 프레임의 바닥(시작) 주소를 가리키는 포인터

이외에도 x64에는 r8, r9, … , r15까지의 범용 레지스터가 더 존재함.


세그먼트 레지스터

: 세그먼트 레지스터(Segment Register)는 x64로 아키텍쳐가 확장되면서 용도에 큰 변화가 생긴 레지스터로, 각 레지스터의 크기는 16bit.


이름주용도
CS(code segment)코드 영역의 시작 주소를 가리킴
DS(data segment)데이터 영역의 시작 주소를 가리킴
SS(stack segment)스택 영역의 시작 주소를 가리킴
ES(extra segment), FS/GS(general purpose segment)운영체제 별로 용도를 결정할 수 있도록 범용적인 용도로 쓰임


명령어 포인터 레지스터

: 명령어 포인터 레지스터(Instruction Pointer)는 CPU가 어느 부분의 기계어 코드를 다음으로 실행할지 가리키는 역할을 함. x64 아키텍처의 명령어 레지스터는 RIP(Instruction pointer)이며, 크기는 64bit.


플래그 레지스터

: 플래그 레지스터(Flag Register)는 프로세서와 다양한 산술결과의 현재 상태를 저장하고 있는 레지스터. x64 아키텍처에서는 RFLAGS라고 불리는 64bit 크기의 플래그 레지스터가 존재함. 64bit이므로 최대 64개의 플래그를 저장할 수 있지만, 실제로는 20여개의 비트만을 사용함.

x86의 EFLAGS를 참고


레지스터 호환


x86-64 아키텍처는 IA-32의 64비트 확장 아키텍처이며, 호환이 가능합니다. 따라서 x86-64에서 IA-32의 레지스터를 그대로 사용이 가능합니다. 예를 들어, x86의 레지스터인 eax는 x64의 레지스터인 rax의 하위 32비트를 의미합니다. 그림으로 나타내면 아래와 같습니다.

image


🔽 Register 구성

63~0비트31~0비트15~0비트15~8비트7비트~0비트
RAXEAXAXAHAL
RBXEBXBXBHBL
RCXECXCXCHCL
RDXEDXDXDHDL
RSIESISI--
RDIEDIDI--
RSPESPSP--
RBPEBPBP--

[Study] IDA 사용법

[HackCTF] Welcome_rev