04, IA-32 Register 기본 설명
4.1.CPU 레지스터란?
레지스터: CPU 내부에 존재하는 다목적 공간
- Ram과는 다른 성격을 가진다.
- CPU가 RAM에 있는 데이터를 엑세스 하기 위해서는 물리적으로 먼 길을 돌아가야 하기 때문에 시간이 오래 걸린다. 그러나 레지스터는 CPU와 한 몸이기 때문에 고속으로 데이터를 전송할 수 있다.
4.1.1.레지스터를 알아야 하는 이유?
- 리버싱 초급 단계에서 애플리케이션 디버깅을 잘 하려면 디버거가 해석해 주는 어셈블리 명령어를 공부해야 한다.
- 어셈블리 명령어의 대부분은 레지스터를 조작하고 그 내용을 검사하는 것들인데, 정작 레지스터를 모르면 명령어 자체도 이해하기 힘들다.
4.2. IA-32의 레지스터
- Intel Architecture 32비트 레지스터
4.2.1.Basic Program execution register
1) General Purpose Register(32비트 -8개)
- 범용 레지스터
- 범용적으로 사용되는 레지스터(막 쓰는 레지스터)
- IA-32에서 각각의 범용 레지스터들의 크기는 32비트(4바이트)
- 상수/주소 등을 저장할 때 주로 사용
- 특정 어셈블리 명령어에서는 특정 레지스터를 조작
- 어떤 레지스터들은 특수한 용도로 사용
- 주로 산술연산 명령어에서 상수/변수 용도로 사용
- 어떤 어셈블리어들은 특정 레지스터를 직접 조작 (명령어 실행이후 레지스터 값이 변함)
2) Segment Registers(16비트 -6개)
- 세트먼트: IA-32 메모리 관리에서 나오는 용어
- 메모리를 조각내러 각 조각마다 시작주소, 범위, 접근권한 등을 부여해서 메모리를 보호하는 기법
- 페이징(Paging) 기법과 함께 가상 메모리를 실제 물리 메모리로 변경할 때 사용
- 세그먼트 메모리는 segment Descriptor Table(SDT)이라고 하는 곳에 기록
- 세크먼트 레지스터는 바로 이 SDT의 index를 가짐
3) Program status and Control Register (32비트 -1개)
- 프로그램 상태와 컨트롤 레지스터
- 플래그(flag) 레지스트의 이름은 EFLAGS이며 32비트(4바이트) 크기
- EFLAGS 레지스터 (16비트의 FLAGS 레지스트의 32비트 확장 형태
- 플래그 레지스트의 특징
(1) 각 비트는 1 또는 0의 값을 가지는데, 이는 On/Off 혹은 True/False를 의미
(2) Flag는 단어 그대로 깃발이 올라가면 1(On/True), 내려가면 0
4) Instruction Pointer (32비트 -1개)
- EIP
- CPU가 처리할 명령어의 주소를 나타내는 레지스터
- 크기는 32비트(4바이트) -> (16비트의 IP 레지스터의 확장 형태)
- EIP에 저장된 메모리 주소의 명령어를 하나 처리하고 난 후 자동으로 그 명령어 길이만큼 EIP를 증가시킨다.
- 범용 레지스터들과는 다르게 EIP는 그 값을 직접 변경할 수 없다. (명령어를 통하여 간접적 변경)
- 레지스터 이름에 E(Extended)가 붙는 경우는 예전 16비트 CPU인 IA-16 시절부터 존재하던 16비트 크기의 레지스터들을 32비트 크기로 확장시켰다는 것이다.
'Reversing > 리버싱 핵심 원리' 카테고리의 다른 글
[리버싱 핵심 원리] 16장, Base Relocation Table (0) | 2020.11.07 |
---|---|
[리버싱 핵심 원리] 5장, 스택(Stack) (0) | 2020.11.07 |
[리버싱 핵심 원리] 3장, 리틀 엔디언 표기법 (0) | 2020.11.07 |
[리버싱 핵심 원리] 8장, abex' crackme #2 분석 (0) | 2020.11.07 |
[리버싱 핵심 원리] 7장, 스택 프레임 (0) | 2020.11.07 |