본문 바로가기

Penetration/etc

개인 공부 - 리버싱 분야(레지스터)

레지스터 - CPU 연산에서 사용하는 자료를 보관하는 작고 빠른 메모리

CPU에서는 주기억장치장치에서 레지스터로 데이터를 옮겨와 데이터를 처리한 후 그 내용을 다시 주기억 장치로 저장하는 구조로 설계되어 있다.

 

레지스터는 소프트웨어 레지스터하드웨어 레지스터로 구분된다.

소프트웨어 레지스터범용 레지스터, 제어 레지스터, 세그먼트 레지스터, 상태 레지스터로 구분할 수 있음

 

소프트웨어 레지스터

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

범용 레지스터는 논리, 산술 연산에 사용되는 오퍼랜드나 주소 계산을 위한 오퍼랜드, 메모리 포인터에 사용된다.

레지스터  설명
AX(Accumulator register)  산술 연산에 사용 (누산기)
BX(Base register)  데이터의 포인트로 사용
CX(Counter register)   이동 연산과 루프에서 카운터로 사용
DX(Data register)  산술과 I/O 연산에 사용
SP(Stack Pointer register)   스택의 최상위 포인터
BP(Base Pointer register)  스택의 기준 포인터
SI(Source Index register)  메모리 스트림 연산에서 소스 포인터
DI(Destination Index register)  메모리 스트림 연산에서 목적지 포인터

 

2. 명령어 레지스터(Instruction Register)

명령어 주소를 계산하는데 사용하는 것으로 IP(Instruction Pointer register)가 있다. PC(Program Counter)라고도 불리며, 프로그램 코드에서 다음에 수행해야 할 명령어의 위치를 저장하고 있음

 

3. 세그먼트 레지스터(Segment Register)

각 세그먼트의 위치를 나타내며, 물리 주소로 변환할 때 사용된다.

세그먼트는 코드(text), 데이터(data), 스택(stack), 라이브러리 세그먼트로 구성된다.

레지스터 설명
SS(Stack Segment) 스택 세그먼트의 시작 주소
CS(Code Segment) 코드 세크먼트의 시작 주소
DS(Data segment) 데이터 세그먼트의 시작 주소
EX(Extra segment)
FS(F segment)
GS(G segment)
추가 세그먼트를 가리키는 시작 주소

 

4. 플래그 레지스터(Flag Register)

이 레지스터는 프로그램이 수행되는 순간마다 프로그램의 수행 상태를 비트 단위로 저장한다.

플래그 설명
CF(Carry Flag) 마지막 산술 연산이 레지스터 크기를 초과하여 비트를 빌리거나(뺄셈) 올림(덧셈)이 발생한 경우
PF(Parity Flag) 최하위 비트가 0인 경우(2의 배수)
AF(Adjust Flag) 산술연산에서 BCD 숫자의 캐리가 발생한 경우
ZF(Zero Flag) 연산 결과가 0인 경우
SF(Sign Flag) 연산 결과가 음수인 경우
TF(Trap Flag) 한 번에 하나의 연산만 수행하고, 디버거에서 중단점을 설정한 곳에서는 TF가 설정됨
IF(Interruption Flag) 인터럽트가 사용가능한 경우
DF(Direction Flag) 설정할 경우 스트림 문자열 연산에서 역순으로 읽음)
OF(Overflow Flag) 부호있는 산술연산 결과가 레지스터가 표현할 수 없는 값일 경우

 

레지스터 크기

16비트 레지스터 이름에 E가 붙으면 32비트 레지스터가 되고 R이 붙으면 64비트 레지스터가 된다.

 

하드웨어 레지스터

하드웨어 레지스터제어 레지스터디버그 레지스터로 구분된다.

 

제어 레지스터

CR0(paging) - PE(보호/리얼모드)와 PG(no Paging/paging)을 제어함

CR2 - 페이징 오류 주소를 저장

CR3 - 페이지 데이터의 베이스 주소로, PG가 1일 때 선형 주소를 물리 주소로 바꿀 때 사용

CR4 - 보호모드에서 8060 가상화 운영

CR8 - 64비트 모드에서 사용

 

디버그 레지스터

DR0 ~ DR3 - 4개의 중단점(break point) 주소

DR6 - 디버그 상태를 발생시키면 디버그 예외처리를 보호하고 있을 때, 예외 처리 핸들러를 실행하기 전에 활성화하고 반환하기 전에 0으로 설정함

DR 7 - 중단점 상태를 선택적으로 활성화시킴

 

컴퓨터 명령어 코드

명령어 코드(OP code)오퍼랜드(Operand)로 구성된다.

명령어 코드로는 CPU가 실행할 연산 및 명령어를 알 수 있다.

오퍼랜드로는 명령어가 처리할 데이터나 저장된 주소에 관한 정보를 알 수 있다.

 

CPU 특성에 따라 어셈블리어 명렁어를 구분해야 한다.

 

컴퓨터의 주소처리 방식

오퍼랜드의 주소처리 방식은 직접 주소간접 주소 모두 가능하다.

직접주소는 기억장소 주소를 직접 지정하는 방법이고,

간접주소는 실제 피연산자가 있는 주소를 지정하는 방법이다.