[정보 보안] 리버싱

[Reversing] 기초 이론_CPU와 레지스터_3

ITsubin 2022. 8. 19. 20:14

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 보다 속도가 뛰어나다.