리버싱 엔지니어링/리버싱 핵심 원리
4 IA-32 Register 기본 설명
흰싸라기
2022. 2. 6. 03:18
IA-32 Register : 인텔의 32비트 마이크로 프로세스에서 사용하는 명령 집합 아키텍처
4.1 CPU 레지스터
레지스터(Register) : CPU 내부에 존재하는 다목적 저장 공간. CPU와 한 몸 이기 때문에 고속으로 데이터 처리 가능
- 어셈블리 명령어의 대부분은 레지스터를 조작하고 그 내용을 검사하는 것들이기 때문에 레지스터에 대해서 알아야 함.
4.2 Bagic program execution registers
: IA-32 Register 종류 중 하나. 디버깅 초급 단계에서 알아두면 좋음.
4.2.1 범용 레지스터 (General-Purpose Registers)
: 범용적으로 사용되는 레지스터(막 쓰는 레지스터)
- 각각의 범용 레지스터들의 크기 : 32비트(4바이트)
- 상수/주소 등을 저장하기 위해 사용
레지스터의 구성
- 예시 ) EAX 기준
- EAX : (0~31) 32비트
- AX : (0~15) EAX의 하위 16비트
- AH : (8~15) AX의 상위 8비트
- AL : (0~7) AX의 하위 8비트
- 상황에 맞게 레지스터를 8비트, 16비트, 32비트 나누어 사용
상수/변수 값의 저장 용도로 쓰이는 레지스터
- EAX : 산술 연산에 주로 사용 되고 함수 리턴 값을 저장하는데에 사용됨.
- EBX : 데이터 주소를 가리키는 포인터로 사용.
- ECX : 반복문 명령어에서 반복 카운트로 사용. 루프를 톨 때마다 ECX를 1씩 감소시킴.
- EDX : 산술 연산 및 I/O 명령에서 사용.
메모리 주소를 저장하는 용도로 쓰이는 레지스터 (포인터로 사용)
- EBP : 함수가 호출되었을 때 그 순간의 ESP를 저장하고 있다가, 함수가 리턴하기 직전에 다시 ESP에 값을 되돌려주어 스택이 깨지지 않도록 (Stack Frame 기법)
- ESI, EDI : 특정 명령어(LODS, STOS, REP MOVS 등)과 함께 주로 메모리 복사에 사용됨.
- ESP : 스택 메모리 주소를 가리킴
4.2.2 세그먼트 레지스터(Segment Registers)
: 메모리를 조각내어 각 조각마다 시작 주소, 범위, 접근 권한 등을 부여해서 메모리를 보호하는 기법
- 각각 레지스터의 크기 : 16비트(2바이트)
레지스터 구성
- CS : 코드 세그먼트
- SS : 스택 세그먼트
- DS: 데이터 세그먼트
- ES, FS, GS : 추가적인 데이터 세그먼트
- FS는 애플리케이션 디버깅에도 등장. 고급 디버깅 주제.
4.2.3 프로그램 상태와 컨트롤 레지스터(Program Status and Control Register)
- 레지스터 크기 : 32비트(4바이트)
- 각 비트마다 의미를 가지고 있음
- 0,1의 값을 가지는데 On/Off 혹은 True/false를 의미
애플리케이션 디버깅에 필요한 flag
- Zero Flag(ZF) : 연산 명령 후 결과 값이 0이 되면 1(True)로 세팅
- Overflow Flag(OF) : 부호 있는 수(signed integer)의 오버플로가 발생했을 때 1로 세팅.
- Carry Flag(CF) : 부호 없는 수(unsigned integer)의 오버플로가 발생했을 때 1로 세팅.
4.2.4 (Instruction Pointer)
- 레지스터 크기 : 32비트(4바이트
- CPU는 EIP에 저장된 메모리 주소의 명령어를 처리하고 자동으로 그 명렁어 길이만큼 EIP를 증가시키며 명령어를 처리해 나감.
- EIP 값은 직접 변경 불가
- 특정 명령어(JMP, Jcc, CALL, RET)를 사용하거나 인터럽트, 예외를 발생시켜야 함.