관리 메뉴

HeeJ's

[02] CPU 레지스터 구조 :: BOF 본문

<Information Security>/<System>

[02] CPU 레지스터 구조 :: BOF

meow00 2020. 8. 30. 23:06

레지스터?

CPU가 프로세스를 실행하기 위해서 프로세스를 CPU에 적재시켜야 한다.

또, 흩어져 있는 명령어 집합과 데이터들을 적절하게 사용하기 위해서 여러 저장공간이 필요하다.

cpu가 빨리 읽고 써야하는 데이터들이기 때문에 cpu 내부 메모리를 사용한다.

=> 레지스터(register)

 

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

2. 세그먼트 레지스터(segment register)

3. 포인트 레지스터(point register)

4. 플래그 레지스터(Program status and control register)

5. 인덱스 레지스터(Index register)

6. 인스트럭션 포인터(instruction pointer)

 

- 범용 레지스터

논리 연산, 수리 연산에 사용되는 피연산자,

주소 계산에 사용되는 피연산자,

메모리 포인터가 저장되는 레지스터

프로그래머가 임의로 조작할 수 있게 허용되어있는 레지스터

AX 레지스터의 상위 부분을 AH라고 하고 하위 부분을 AL이라고 한다.

 

<각 레지스터의 목적>

EAX - 피연산자와 연산 결과의 저장소

EBX - DS segment안의 데이터를 가리키는 포인터

ECX - I/O 포인터

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

EDI - ES 레지스터가 가리키고 있는 data segment내의 데이터를 가리키고 있는 포인터

        문자열 처리에서 destination을 가리킴

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

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

 

- 세그먼트 레지스터

code segment, dasta segment, stack segment를 가리키는 주소가 들어있는 레지스터

CS
DS
SS
ES
FS
GS

프로세스의 특정 segment를 가리키는 포인터 역할

CS 레지스터는 code segment를,

DS, ES, FS, GS 레지스터는 data segment를,

SS 레지스터는 stack segment를 가리킨다.

 

레지스터가 가리키는 위치를 바탕으로 원하는 segment 안의 특정 데이터, 명령어들을 정확하게 끄집어 낼 수 있다.

- 포인터 레지스터

EBP(베이스 포인터) - 스택 내의 변수 값을 읽는데 사용

ESP(스택 포인터) - 스택의 가장 끝 주소를 가리킴

EIP(명령어 포인터) - 다음 명령어의 오프셋을 저장하며 CS 레지스터와 합쳐져 다음에 수행될 명령의 주소 형성

 

- 플래그 레지스터

프로그램의 현재 상태나 조건 등을 검사하는데 사용되는 플래그들이 있는 레지스터

EFLAGS

상태 플래그, 컨트롤 플래그, 시스템 플래그들의 집합이다.

시스템이 리셋되면 이 레지스터는 0x00000002의 값을 가진다.

1, 3, 5, 15, 22~31번 비트는 예약되어 있어 SW에 의해 조작할 수 없다.

 

<각 플래그의 역할>

Status flags

CF(carry flag) - 연산을 수행하면서 carry 혹은 borrow가 발생하면 1이 된다.

* carry & borrow - 덧셈 연산시 bit bound를 넘어가거나 뺄셈을 할 때 빌려오는 경우

PF(Parity flag) - 연산 결과 최하위 바이트 값이 1이 짝수일 경우 1이 된다.

                      패리티 체크에 사용된다.

AF(Adjust flag) - 연산 결과 carry와 borrow가 3bit 이상 발생할 경우 1이 된다.

ZF(Zero flag) - 결과가 zero임을 가리킨다. 조건문이 만족될 경우 set

SF(Sign flag) - 연산 결과 최상위 비트 값과 같다. 양수이면 0, 음수이면 1이 된다.

OF(Overflow flag) - 정수형 결과 값이 너무 큰 양수이거나, 너무 작은 음수여서 피연산자의 데이터 타입에 모두 들어가지 않을 경우 1이 된다.

DF(Direction flag) - 문자열 처리에 있어 1일 경우 문자열 처리 instruction이 자동 감소, 0일 경우 자동 증가

                          (문자열 처리가 high address -> low address로 진행)

 

System flags

IF(Interrupt enable flag) - 프로세서에게 mask한 interrupt에 응답할 수 있게 하려면 1을 준다.

Interrupt Mask : 인터럽트가 발생하였을 때 요구를 받아들일지 말지 지정하는 것

TF(Trap flag) - 디버깅을 할 때 single-step을 가능하게 하려면 1을 준다.

IOPL(I/O privilege level field) - 현재 수행중인 프로세스 혹은 task의 권한 레벨을 가리킨다.

                                         CPL(현재 수행중인 프로세스 권한을 가리킴)이 I/O address 영역에 접근하기 위해서는 privilege level보다 작거나 같아야한다.

NT(Nested task flag) - Interrupt의 chain을 제어한다. 1이 되면 이전 실행 task와 현재 task가 연결되어있음을 나타낸다.

RF(Resume flag) - Exception debug하기 위해 프로세서의 응답 제어

VM(Virtual-8086 mode flag) - Virtual-8086 모드를 사용하려면 1을 준다.

Virtual-8086 모드 : 인텔 i386에서 처음 지원되기 시작한 CPU의 명령 세트 아키텍쳐의 동작 모드의 하나이다.

AC(Alignment check flag) - 이 비트와 CR0 레지스터의 AM비트가 set되어있으면 메모리 레퍼런스의 적합도 검증이 가능하다.

VIF(Virtual interrupt flag) - IF flag의 가상 이미지. VIP flag와 결합시켜 사용

VIP(Virtual interrupt pending flag) - 인터럽트가 경쟁 상태가 되었음을 가리킨다.

ID(Identification flag) - CPUID instruction을 지원하는 CPU인지를 나타낸다.

 

 

- 인덱스 레지스터

EDI(목적지 인덱스) - 목적지 주소에 대한 값 저장

ESI(출발지 인덱스) - 출발지 주소에 대한 값 저장

- 인스트럭션 포인터

다음 수행하야 하는 명령이 있는 메모리 상의 주소(현재 code segment의 offset 값)가 들어있는 레지스터

EIP

하나의 명령어 범위에서 선형 명령 집합의 다음 위치를 가리킨다.

또한 JMP, Jcc, CALL, RET와 IRET instruction이 있는 주소값을 가진다.

EIP 레지스터는 SW에 의해 바로 엑세스 할 수 없고 control-transfer instruction이나 interrupt와 exception에 의해 제어된다. EIP 레지스터를 읽는 법은 instruction의 address를 읽는 것이다. 프로시저 스택의 return instruction pointer의 값을 수정하고 return instruction(RET, IRET)을 수행함으로써 EIP 레지스터의 값을 간접적으로 지정해줄 수 있다.

instruction address : CALL instruction을 수행하고 나서 프로시저 스택으로부터 리턴하는 값
프로시저; 프로그램을 여러 개의 단위로 분할한 것

 

 

 

출처;

1. 달고나 버퍼오버플로우 pdf

2. https://medium.com/@lazypanda43/%EC%9D%B8%ED%84%B0%EB%9F%BD%ED%8A%B8-%EC%A2%85%EB%A5%98%EC%99%80-%EC%B2%98%EB%A6%AC%EA%B3%BC%EC%A0%95%EA%B3%BC-%EC%9A%B0%EC%84%A0%EC%88%9C%EC%9C%84-c95c26909472

3. https://m.blog.naver.com/PostView.nhn?blogId=absoliam&logNo=70107601495&proxyReferer=https:%2F%2Fwww.google.com%2F

4. https://ko.wikipedia.org/wiki/%EA%B0%80%EC%83%81_86%EB%AA%A8%EB%93%9C

'<Information Security> > <System>' 카테고리의 다른 글

[6] File Integrity Operator  (0) 2022.01.24
[05] Byte Order :: BOF  (0) 2020.09.13
[04] Buffer Overflow의 이해 :: BOF  (0) 2020.09.10
[03] 어셈블리어 :: BOF  (0) 2020.09.10
[01] 메모리 구조 :: BOF  (0) 2020.08.29