해보자고

[리버싱 핵심 원리] 4장 & 5장 정리 본문

리버싱/리버싱 핵심 원리

[리버싱 핵심 원리] 4장 & 5장 정리

초코맛동산 2023. 11. 3. 23:55

# 학습 목표

- 4장: IA-32 Register 기본 설명

- 5장: 스택

 

4. IA-32 Register 기본 설명 

4.1 CPU 레지스터

레지스터: CPU 내부에 존재하는 다목적 저장 공간. 따라서 고속으로 데이터 처리가 가능.

 

4.2 IA-32 레지스터

4.2.1 Basic program execution registers

1. 범용 레지스터 (General Purpose Registers)

- 범용적으로 사용되는 레지스터 

- 32비트(4바이트) // 교재 참고

 

- AX: 주로 계산할 때 사용. EAX는 주로 함수 리턴 값에 사용. 모든 Win32 API 함수들은 리턴 값을 EAX에 저장 후 리턴. 

- BX: 메모리 주소 계산에 사용

- CX: 반복문에서 몇 번째로 반복하고 있는지 기억할 때 사용. 루프를 돌 때마다 1씩 감소.

- DX: 계산의 결과 값을 저장. 또는 메모리에서 읽어온 데이터를 저장 

- SI: 메모리 복사 등에서 원본 데이터의 주소 저장

- DI: 메모리 복사 등에서 목적지의 주소 저장할 때 사용

- BP: 스택 주소를 보존할 때 사용

- SP: 현재의 스택 주소 저장

 

2. 세그먼트 레지스터 (Segment Registers) // 교재 참고.. 

세그먼트: 메모리를 조각내어 각 조각마다 시작 주소, 범위, 접근 권한 등을 부여해 메모리를 보호하는 기법. 

- 세그먼트 메모리는 Segment Descriptor Table(SDT)에 기술되어 있고, 세그먼트 레지스터는 SDT의 index를 저장함. 

- 16비트(2바이트)

 

- CS: 프로그램의 코드 세그먼트

- SS: 스택 세그먼트

- DS: 데이터 세그먼트

- ES, FS, GS: 추가적인 데이터 세그먼트 

 

3. 프로그램 상태와 컨트롤 레지스터

EFLAGS: 플레그 레지스터

- 32비트(4바이트) // 16비트의 FLAGS의 확장 형태가 EFLAGS

- 각 비트는 1 또는 0의 값을 지님. (T/F)

- 현재의 리버싱 단계(그러니까 초보... )에서는 ZF, OF, CF만 기억해두자

 

(이미지는 교재 혹은 구글 참고.) 

 

- ZF: Zero Flag, 연산 명령 후 결과 값이 0이면 True로 세팅된다.

- OF: Oveflow Flag, signed integer의 oveflow 발생시 1로 세팅. 그리고 MSB(Most Significant Bit)가 변경되었을 때 1로 세팅. 

- CF: Caffy Flag, unsigned integer의 overflow 발생시 1로 세팅.

 

4. Instruction Pointer

EIP: Instruction Pointer

- CPU가 처리할 명령어의 주소를 나타낸다. 

- 32비트(4바이트) // 16비트 IP 레지스터의 확장 형태가 EIP

5. 스택

5.1 스택

프로세스에서의 스택 메모리 역할: 

 

1) 함수 내의 로컬 변수 임시 저장

2) 함수 호출 시 파라미터 전달

3) 복귀 주소(return address) 저장

5.2 스택의 특징

 

- ESP(스택 포인터) 의 초기값은 Stack Bottom에 가깝다. 

- 높은 주소 -> 낮은 주소 방향으로 자라난다.