Main Register (메인 레지스터)
> 주로 산술연산 명령어에서 데이터 저장 용도로 많이 사용된다. (그 밖에 특수한 용도로도 사용)
> 32비트의 크기를 갖고 있고, 데이터를 효율적으로 사용하기 위해 구역을 나누어 사용한다.
EAX (Accumulator)
> 산술/논리 연산의 중심이 되는 레지스터이다. 곱셈, 나눗셈 명령에서 자동으로 사용한다.
> 함수 리턴 값이 저장된다.
EBX (Base Register)
> 간접번지 지정에 사용된다. (EBX + EAX -> 64비트 연산)
> 메모리 주소 지정을 확장, 포인터
ECX (Count Register)
> 반복 명령어에서 반복 횟수를 지정에 사용된다.
EDX (Data Register)
> 간접 번지 지정에 사용된다. (EDX + EAX -> 64비트 연산)
> 입출력 연산 , EAX와 같이 쓰임 (OEP값이 입력)
EAX 기준으로 레지스터를 나눈 구획을 살펴보면 EAX는 0~31비트 총 32비트의 크기를 갖는다.
AX, AH, AL의 크기는 아래와 같다.
AX : 0~15비트 EAX의 하위 16비트
AH : 8~15비트 AX의 상위 8비트
AL : 0~7비트 AX의 하위 8비트
Pointer Register(포인터 레지스터)
> ESP(Stack Pointer) Stack에 들어온 최신 데이터주소를 저장한다.
> EBP(Base Pointer) 실행 중인 함수의 시작 주소를 저장한다.
Index Register(인덱스 레지스터)
> ESI(Source Index) 복사 또는 비교를 수행 시 출발지 주소를 저장한다.
> EDI(Destination Index) 복사 또는 비교를 수행 시 목적지 주소를 저장한다.
Status Register(상태 레지스터)
> Status 레지스터는 현재의 상태를 표시하기 위해서 사용되며, 어셈블리 명령을 수행 중 동일한 명령도
상태 플래그 값을 참조하여 다른 연산을 수행하게 만들어 준다.
> 산술, 논리 연산을 하게 되면 Status 레지스터의 값이 설정된다.
CF : 부호 없는 수의 Overflow가 발생할 때 설정된다.
ZF : 연산 결과 값이 '0' 일 때 [ 값: 1 ] 그 외는 통과
SF : 연산 결과 최상위 비트가 음수(1)일 때 [ 값: 1 ] 그 외는 통과
OF : 부호 있는 수의 Overflow가 발생할 때 설정된다.
Segment Register(세그먼트 레지스터)
CS(Code Segment)
> 코드 세그먼트의 시작 번지
> Instruction Pointer 레지스터(EIP) Offset 값과 합쳐서 실행을 위한 명령어 주소를 참조
DS(Data Segment)
> 데이터 세그먼트의 시작번지
> AX, CX, DX, SI, DI 레지스터와 합쳐서 데이터 영역의 주소를 참조
SS(Stack Segment)
> Stack 세그먼트의 시작번지
> SP, BP 레지스터와 합쳐서 Stack 영역의 주소를 참조
Instruction Pointer(인스트럭션 포인터)
EIP(Instruction Pointer)
> CPU가 다음에 실행 명령의 주소 값을 저장.
> EIP 레지스터의 값은 직접 변경이 불가능 (단, 간접적으로 변경은 가능. 실행흐름을 방해할 수 있음)
EBP = base pointer : 스택 시작 주소 값
ESP = stack pointer : 스텍 끝 주소
EIP = instruction point : 다음 명령어가 실행될 메모리주소 저장
ESI = source index : 데이타 출발지 주소에 대한 값 (복사,조작)
EDI = destination index : 데이타 목적지 주소에 대한 값
Debug Register(디버그 레지스터)
> 디버그 레지스터는 디버그 동작을 제어하는데 사용된다.
> 레지스터는 DR0~DR7 까지 8개 (실제 사용은 6개이다.)
DR0 - DR3 : 하드웨어 브레이크 포인트 시 주소를 저장
DR4 - DR5 : 예약이 되어 있고, 사용되지 않는다.
DR6 : 현재 브레이크 포인트가 걸려 있는 상태
DR7 : 브레이크 포인트를 제어.
브레이크 포인터[ Software Breakpoint / Hardware Breakpoint ]
Software Breakpoint
> CPU 인터럽트를 이용하여 운영체제에게 특정 이벤트를 알려주며 CC(int3) 라는 인터럽트가 발생되면
프로그램의 동작이 멈추고 디버거에게 넘겨져 제어.
> Software Breakpoint는 개수 제한이 없다.
Hardware Breakpoint
> 디버그 레지스터인 DR0, DR1, DR3, DR6, DR7을 이용
> DR0~DR3은 Breakpoint를 걸어줄 대상의 주소 또는 범위를 설정
> DR6은 인터럽트가 발생했을 때 결과
> DR7은 Breakpoint의 속성을 설정
> 특정 메모리 주소에 Write, Read, Excute가 발생했을 때 어떤 주소에서 실행이 되었는지 알 수 있음
> Hardware Breakpoint는 최대 4개 밖에 사용하지 못하지만 ( DR0~DR3 ) Software Breakpoint 보다 속도가 뛰어나다.
'[정보 보안] 리버싱' 카테고리의 다른 글
[Reversing] 기초 이론_Assembly(어셈블리)_3 (0) | 2022.08.22 |
---|---|
[Reversing] 기초 이론_Assembly(어셈블리)_2 (0) | 2022.08.21 |
[Reversing] 기초 이론_Assembly(어셈블리) (0) | 2022.08.20 |
[Reversing] 기초 이론_CPU와 레지스터_2 (0) | 2022.08.18 |
[Reversing] 기초 이론_CPU와 레지스터 (0) | 2022.08.10 |