안 쓰던 블로그
Register 본문
레지스터
레지스터: CPU 내부에 존재하는 작은 고속의 다목적 메모리
저장 공간이라고는 하지만 일반적으로 말하는 메모리인 RAM과는 성격이 조금 다르다
CPU가 RAM에 있는 데이터에 접근하기 위해서는 물리적으로 돌아가야 하기 때문에 오래 걸리지만, 레지스터는 CPU 내부에 존재하기 때문에 더 빠른 연산 속도를 갖는다
종류로는 범용, 세그먼트, 상태 플래그, 명령 포인터 레지스터 등등.. 이 있다
범용 레지스터
이름 그대로 '범용'적으로 쓰이는 레지스터
계산, 메모리 주소 지정, 임시 저장 공간 등의 목적으로 사용되며 32bit로 구성된다
EAX: 입출력, 산술, 논리 연산을 수행하는 누산기 레지스터로 함수의 리턴값을 저장한다(32비트)
AX: EAX의 하위 16비트(AX에서 확장 Extended되었다고 EAX)
AH: AX의 상위 8비트(High라서 H)
AL: AX의 하위 8비트(Low라서 L)
EBX: ESI나 EDI와 결합하여 주소 지정을 확장하기 위한 인덱스으로서 사용(32비트)
BX(16비트)
BH/BL(8비트)
ECX: 반복 명령어 사용시 반복 카운터로 사용(32)
CX(16)
CH/CL(8)
EDX: EAX의 보조적인 역할로 쓰이며 큰 수의 산술, 논리 연산 등에서 부호 확장 명령에 사용(32)
DX(16)
DH/DL(8)
포인터 레지스터
메모리 스택 영역과 관련된 주소 값을 나타낸다
ESP: 스택 포인터, 스택 프레임의 끝 지점 주소가 저장된다. PUSH, POP 명령에 따라 ESP값이 4byte씩 변한다
EBP: 베이스 포인터, 스택 프레임의 시작 지점 주소가 저장된다. 현재 사용되는 스택 프레임이 소멸되지 않는 동안 EBP의 값은 변하지 않는다. 현재 스택 프레임이 소멸되면 이전에 사용되던 스택 프레임을 가리킨다
인덱스 레지스터
문자열을 복사, 비교한다
ESI: 소스 인덱스, 데이터 복사나 조작할 때 Source Data의 주소가 저장된다
EDI: 데스티네이션 인덱스, 복사 작업시 Destination의 주소가 저장된다
명령어 레지스터
EIP: 다음 실행 할 명령이 들어 있는 메모리 주소를 가리킨다
세그먼트 레지스터
크기 구분을 목적으로 사용한다. 16bit로 구성된다
CS: 코드 세그먼트, 함수/제어문 등 실행 가능한 명령어가 저장된다
DS: 데이터 세그먼트, 프로그램에서 사용되는 전역/정적 변수 데이터가 저장된다
SS: 스택 세그먼트, 주소와 데이터를 일시적으로 저장할 목적으로 쓰이는 스택의 주소를 지정하는 데 사용한다
ES: 추가 레지스터, 문자 데이터의 주소를 지정하는 데 사용한다
플래그 레지스터
실행 순서를 제어한다
OF: 오버플로우 플래그, 부호 있는 연산 결과가 용량보다 클 때(=오버플로우) 세트(1)된다
ZF: 연산 결과가 0일 때 세트(1) 된다. 연산 결과가 0이 아니면 해제(0)된다
SF: 연산 결과가 음수가 되면 세트(1)된다. 연산 결과가 양수가 되면 해제(0)된다
DF: 문자열을 이동하거나 비교할 때 문자열의 처리 방향에 따라 세트되어 방향을 결정한다
IF: 키보드 입력같은 외부 인터럽트의 처리 여부를 나타낸다
PF: 연산 결과 1비트들의 개수에 따라 짝수/홀수 패리티를 나타낸다
CF: 자리 이동이나 회전연산 후 마지막 비트 내용을 나타낸다
TF: 프로세서 연산 사용
AF: 특수화된 산술에서 사용
'CTF > Reversing' 카테고리의 다른 글
dreamhack rev-basic-0 풀이 (0) | 2020.09.14 |
---|---|
어셈블리 코드 C코드로 변환하기 (0) | 2020.09.14 |
리버싱-전역/지역 변수 초기화 (0) | 2020.09.01 |
[리버싱] 메모리 구조, 함수 호출 과정, Stack Frame (0) | 2020.08.30 |
abex crackme 3번-keyfile채우기 (0) | 2020.08.26 |