레지스터는 다시 목적에 따라서 범용 레지스터, 세그먼트 레지스터, 플래그 레지스터, 인스트럭션 포인터로 구성된다.
범용 레지스터는 논리 연산, 수리 연산에 사용되는 피연산자, 주소를 계산하는데 사용되는 피연산자, 그리고 메모리 포인터가 저장되는 레지스터
세그먼트 레지스터는 code segment, data segment, stack segment 를 가리키는 주소가 들어있는 레지스터
플래그 레지스터는 프로그램의 현재 상태나 조건 등을 검사하는데 사용되는 플래그들이 있는 레지스터이다.
인스트럭셕 포인터는 다음에 수행해야 하는 명령이 있는 메모리 상에 주소가 들어가 있는 레지스터 이다.
위 의 그림은 일반적 시스템의 프로그램 레지스터 구성이다.
위의 그림은 범용 레지스터의 구성이다.
그림을 보면 알겠지만 전체 32bits 즉 4바이트를 조작하기 위해선 EAX 를 사용 그 절반인 2바이트를 사용하기 위해서는 AX 를 사용
다시 AX 를 하위 1바이트 상위 1바이트를 각각 AL,AH 로 조작할 수 있다는 것을 보여준다.
각각의 범용 레지스터의 목적은 다음과 같다.
EAX - 피연산자와 연산 결과의 저장소
EBX - DS segment안의 데이터를 가리키는 포인터
ECX - 문자열 처리나 루프를 위한 카운터
EDX - I/O 포인터
ESI - DS 레지스터가 가리키는 data segment 내의 어느 데이터를 가리키고 있는 포인터. 문자열 처리에서 source 를 가리킴
EDI - ES 레지스터가 가리키고 있는 data segment 내의 어느 데이터를 가리키고 있는 포인터. 문자열 처리에서 destination을 가리킴
ESP - SS 레지스터가 가리키는 stack segment의 맨 꼭대기를 가리키는 포인터
EBP - SS 레지스터가 가리키는 스텍상의 한 데이터를 가리키는 포인터
세그먼트 레지스터는 위에서 보는 바와 같이 프로세스의 특정 세그먼트를 가리키는 포인터 역할을 한다. CS 레지스터는 code segment를, DS, ES, FS, GS 레지스터는 data segment를, SS 레지스터는 stack segment를 가리킨다. 이렇게 세그먼트 레지스터가 가리키는 위치를 바탕으로 우리는 원하는 segment안의 특정 데이터, 명령어들 정확하게 끄집어 낼 수 있게 된다.
아래의 그림은 각 레지스터가 가리키는 세그먼트들을 설명해 주고 있다.
다음으로 플래그 레지스터 이다.
컨트롤 플래그 레지스터는 상태 플래그, 컨트롤 플래그, 시스템 플래그들의 집합이다. 시스템이 리셋되어 초기화 되면 이 레지스터는 0x00000002의 값을 가진다. 그리고 1, 3, 5, 15, 22-31번 비트는 예약되어 있어 소프트웨어에 의해 조작할 수 없게 되어있다.
아래의 그림은 플래그 레지스터의 구조를 보여주고 있다.
플래그의 역할 들은 다음과 같다..
'PC리버싱 > (구)기초' 카테고리의 다른 글
오버플로우레지스터에대하여 (0) | 2020.03.15 |
---|---|
플래그(상태) 레지스터 (0) | 2020.03.15 |
세그먼트 레지스터 (0) | 2020.03.15 |
dnspy 간단 사용법 (0) | 2020.03.14 |
리버싱 도구들에관하여 개인적인생각 (0) | 2020.03.14 |