레지스터란 CPU 내부에 존재하는 다목적 저장 공간이다.

 

리버싱 초급 단계에서 디버깅을 잘하려면 디버거가 디스어셈 해주는 어셈블리 명령어를 잘 알아야 한다.

어셈블리 명령어는 레지스터를 다루기에 필수불가결하다.

 

IA-32는 지원하는 기능 뿐만 아니라 레지스터의 수 또한 엄청나다.

워낙 많기에 하나하나 다 나열하기에는 무리가 따른다. 

디버깅 할때 가장 많이 보게 될 레지스터인 Basic program execution register를 다루어 보겠다.

※본인이 관심이 있고 더 알고 싶다면 Control registers, Memory management registers를 공부하는것도 좋다.

 

 

Basic program execution registers

Basic program execution register은 4개의 레지스터로 나뉘어진다.

범용 레지스터, 세그먼트 레지스터, 프로그램 상태와 컨트롤 레지스터, Instruction Pointer

 

범용 레지스터는 32비트 8개

세그먼트 레지스터는 16비트 6개

프로그램 상태와 컨트롤 레지스터는 32비트 1개

Instruction Pointer는 32비트 1개로 되어 있다.

 

범용 레지스터

General purpose register는 말 그대로 범용적으로 사용되는 레지스터이다.

IA-32에서는 32비트로 이루어 져있다.

범용 레지스터

레지스터의 각각의 이름은 32-bit에 적힌대로이다.

 

16-bit AX에서 32비트로 크기가 커지면서 앞에 Extended를 붙여 EAX가 된것이다.

EAX, EBX, ECX, EDX는 산술연산에 주로 사용된다.

EAX는 일반적으로 함수 리턴 값에 사용되며 ECX는 반복문 명령어에서 반복 카운트로 사용된다.

 

EBP, ESI, EDI, ESP는 메모리 주소를 저장하는 포인터로 사용된다.

ESP는 스택 메모리 주소를 가리킨다.

EBP는 함수가 호출되었을때 그순간의 ESP를 저장하고 있다 함수가 리턴되기 직전에 값을 돌려준다.

(이것을 Stack Frame기법이라고 하며 stack pointer와 base pointer는 굉장히 중요하기에 추후에 따로 다루도록 하겠다.)

ESIEDI는 메모리 복사에 사용된다.

 

세그먼트 레지스터

세그먼트(Segment)란 IA-32의 메모리 관리 모델에서 나오는 용어이다.

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

세그먼트 레지스터는 총 6개가 존재한다.  

CS Code Segment (16비트)

SS Stack Segment (16비트)

DS Data Segment (16비트)

ES Extra(Data) Segment (16비트)

FS Data Segment (16비트)

GS Data Segment (16비트)

 

ES, FS, GS 세그먼트는 추가적인 데이터 세그먼트 이다. 마지막으로 FS 레지스터는 애플리케이션 디버깅에도 자주 등장하게 되는데 SEH, PEB등의 주소를 계산할 때 사용된다. 이는 추후 포스팅에서 다루도록 하겠다.

 

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

플래그 레지스터의 이름은 EFLAGS이며 32비트 크기이다.

EFLAGS Register

EFLAGS 레지스터는  각 비트마다 의미를 가진다. 각 비트는  1 또는 0의 값을 가진다.(True or False)

 

저 많은 걸 한번에 다 외우려 하지 말고 우선적으로 사용되는 ZF, OF, CF만 다루어 보도록 하자.

 

Zero Flag(ZF)

연산 명령 후에 결과값이 0이 되면 ZF가 1(True)로 세팅 된다.

 

Oerflow Flag(OF)

부호 있는 수(signed integer, 실수)의 오버플로가 발생했을 때 1로 세팅 된다. MSB가 변경되었을 때 1로 세팅된다.

 

Carry Flag(CF)

부호 없는 수(unsigned integer, 정수)의 오버플로가 발생했을 때 1로 세팅된다.

 

 

Instruction Pointer

CPU가 처리할 명령어의 주소를 나타내는 레지스터이며, 크기는 32비트이다. CPU는 EIP에 저장된 메모리 주소의 명령어를 하나 처리하고 난 후 자동으로 그 명령어 길이만큼 EIP를 증가시킨다.

 

 

사진참조 http://www.intel.co.kr/content/www/kr/ko/architecture-and-technology/64-ia-32-architectures-software-developer-manual-325462.html

'Basic Concepts > Reverse Engineering' 카테고리의 다른 글

가상메모리와 페이징  (0) 2020.02.01
바이트 오더링  (0) 2020.01.24

+ Recent posts