달고나 bof문서나 리버싱을 공부할 때 레지스터의 역할을 외우야 조금 빠르게 읽을 수 있을 것 같아서 정리하였다.


1. eax - 피연산자와 연산 결과의 저장소


범용 레지스터인 eax 레지스터는 산술(사칙연산 등), 논리 연산을 수행하며 함수의 반환값을 해당 레지스터에 저장한다.


연산과 관련된 명령이 eax 레지스터를 사용하기 때문에 eax 레지스터에 저장된 함수의 반환 값을 참고하여 호출 함수의 성공 여부, 실패 여부를 쉽게 파악할 수 있다.


32bit 체계로 전환됨에 따라 ax -> eax로 바뀌었으며 32bit로 구성되어 있다.


2. ebx - DB segment안의 데이터를 가리키는 포인터


범용 레지스터인 ebx 레지스터는 메모리 주소를 저장하기 위한 용도로 사용된다.

특정한 목적으로 설계된 레지스터는 아니며 레지스터의 일반 목적인 저장소로 사용된다.


ESI 레지스터나 EDI 레지스터와 결합될 수 있다.


3. ecx - 문자열 처리나 루프를 위한 카운터


범용 레지스터인 ecx 레지스터는 반복 명령어 사용 시 반복 카운터로 사용된다.

ecx레지스터에 반복할 횟수를 지정하고 반복 작업을 수행한다. 값을 감소시키면서 카운트를 센다는 특징을 가지고 있다.


코드 상에서 반복문은 카운터 값이 증가하는 방향이나 레지스터는 감소하는 방향이므로 혼동하지 말 것


4. edx - I/O(Input/Outut) 포인터


범용 레지스터인 edx 레지스터는 데이터 레지스터라고 부르며 기본적으로 eax 레지스터의 확장 개념으로 사용된다. 부호 확장 명령 등에 쓰인다.

큰 수의 곱셈 혹은 나눗셈 등의 연산이 이루어질 때 사용되며 eax 레지스터와 함께 사용된다.


5. esi - DS 레지스터가 가리키는 data segment 내의 어느 데이터를 가리키고 있는 포인터, 문자열 처리에서 source를 가리킴


DS 레지스터 : 세그먼트 레지스터의 일종으로 data segment의 시작 주소를 포함한다. 

데이터 연산을 위한 Source Index를 나타내거나 입력 데이터 스트림의 위치를 나타내기 위해 사용된다.


인덱스 레지스터의 일종으로 데이터 조작이나 복사 시에 소스 데이터의 주소가 저장된다.


6. edi - ES 레지스터가 가리키는 datasegment 내의 어느 데이터를 가리키고 있는 포인터, 문자열 처리에서 destination을 가리킴


ES 레지스터 : 세그먼트 레지스터의 일종으로 메모리 주소지정을 다루는 스트링(문자 데이터) 연산에서 사용된다.

스트링 연산에서 ES 레지스터는 edi 레지스터와 연관되며, 프로그램이 ES레지스터를 사용할 경우 적절한 세그먼트 주소로 초기화해야 한다.

데이터 연산을 위한 Source Index를 나타내거나 입력 데이터 스트림의 위치를 나타내기 위해 사용된다.


인덱스 레지스터의 일종으로 데이터 조작이나 복사 시에 소스 데이터의 주소가 저장된다.


7. esp - SS 레지스터가 가리키는 stack segment의 맨 꼭대기를 가리키는 포인터


SS 레지스터 :  세그먼트 레지스터의 일종으로 메모리 상에 스택의 구현을 가능케 한다. 주로 스택 세그먼트의 시작 주소가 저장된다.


SS 레지스터에 저장된 스택 세그먼트의 시작주소에 스택 포인터(stack pointer, sp or esp) 레지스터의 오프셋 값을 더하면 참조되고 이쓴ㄴ 스택의 현재 워드를 가리킨다.


함수 호출 시 함수에 전달되는 파라미터가 먼저 스택에 push되고 이후에 리턴 주소가 스택에 push된다.

esp 레지스터는 호출 스택의 가장 높은 위치를 가리키기 때문에 함수 호출 시 esp 레지스터는 리턴 주소를 가리킨다.


8. ebp - SS 레지스터가 가리키는 스택 상의 한 데이터를 가리키는 포인터


ebp 레지스터는 호출 스택의 가장 낮은 위치를 가리키기 때문에 사용되고 있는 스택 프레임이 소멸되지 않는 이상 ebp 레지스터의 값은 변하지 않는다.


9. eip - 현재 실행 중인 명령의 주소를 가리키는 포인터


CPU가 바이너리 코드를 실행시킴에 따라 EIP 레지스터는 CPU가 현재 어느 코드를 실행시키고 있는 중인지 나타내기 위해 계속적으로 실행되는 코드의 주소를 갱신한다.


보통 프로그램에서 ip(명령어 포인터) 레지스터를 참조하지 않으나 디버깅 프로그램을 사용하여 프로그램을 테스트하는 것처럼 ip 레지스터 값을 변경할 수 있다.


+ Recent posts