[IA-32 레지스터]

[Reversing] 2017. 8. 15. 12:56 Posted by 부르곰므

Intel Architecture 32비트라는 뜻의 IA-32.

인텔에서 제공하는 어셈블리 명령어는 어마어마하대.

하나하나 다 외우고 있을 수는 없지만 조금씩 조금씩 공부하다보면 늘겠지.

그런 생각으로 리버싱을 공부해야겠어.


참고로 나는 '리버싱 핵심원리'라는 책으로 리버싱을 공부중이야.

필요한건 구글링도 서슴치 않고 있지.

지금부터 꾸준히 정리하며 공부하다보면 뭔가 되어있지 않을까?


각설하고 일단.

 레지스터는 CPU내부에 존재하는 다목적 저장공간이야. 음... CPU가 RAM에 접근하기에 시간이 오래걸려 레지스터라는 녀석을 통해 고속으로 데이터를 처리한다고 해.

 

 이런 저장공간인 레지스터가 제공하는 어셈블리 명령어의 대부분은 당연히 레지스터를 조작, 그 내용을 검사하는 것들이지.


<Basic program execution registers>

1) 범용 레지스터

 범용적으로 막 쓰는 레지스터들. 16비트인 시절부터 쓰여왔던 명령어들에 'E'가 붙어서 32비트에서사용하게 되었음.

 (산술연산 ADD, SUB, XOR, OR 등에서 사용)

- EAX : Accumulator for operands and results data /// 함수 리턴 값에 사용된다.

- EBX : Pointer to data in the DS segment

- ECX : Counter for string and loop operations /// 반복문에서 반복 카운트로 사용(루프를 돌때마다                                                                 ECX가 1씩 감소된다.)   

- EDX : I/O pointer

(메모리 주소를 저장하는 포인터)

- EBP : Pointer to data on the stack (in the SS segment) /// 함수 호출 시 순간의 ESP를 저장하고                                                                            있다가 함수가 리턴하기 직전에 ESP에                                                                            값을 되돌려 스택이 깨지지 않도록 한다.

- ESI : source pointer for string operations /// LODS, STOS, REP MOVS등이랑 메모리 복사에 사용

- EDI : destination pointer for string operations

- ESP : Stack pointer (in the SS segment) /// 스택 메모리 주소(다른용도로 사용하지 말아야 한다)


2) 세그먼트 레지스터

 메모리관리 모델에서 나오는 용어인데, 어렵기 때문에 전문가들은 일단 리버싱을 진행하라고 추천한다고 해.

 IA-32 보호 모드에서 메모리를 조각내어 각 조각마다 시작 주소, 접근 권한 등을 부여해서 메모리를 보호하는 기법을 말함. 또한 페이징 기법과 함께 가상 메모리를 실제 물리 메모리로 변경할 때 사용.

 세그먼트 메모리는 SDT라는 곳에 있다. 세그먼트 레지스터는 이 SDT의 index를 가지고 있다.

- CS : 코드 세그먼트

- SS : 스택 세그먼트

- DS : 데이터 세그먼트

- ES, FS, GS : 데이터 세그먼트.(추가적으로 사용)


3) 프로그램 상태와 컨트롤 레지스터

 플래그 레지스터(EFLAGS)_16비트 FLAGS의 확장형

32개의 비트로 이루어져있는 EFLAGS레지스터는 각각의 비트마다 의미를 지닌다.

각 비트는 1/0의 값을 가지며 음영처리된 부분은 예약된 비트로 사용할 수 없다. ZF, OF, CF 3가지에 대해서는 애플리케이션 디버깅에 필요해서 잘 이해하자. 특히, 이 3가지는 조건 분기 명령어(jcc)에서 이를 참조해서 동작 수행 여부를 결정하기 때문이다.

 

- ZF(zero flag) : 연산 명령 후에 결과 값이 0이 되면 ZF가 1로 세팅된다.

- OF(overflow flag) : signed integer(부호 있는 수)의 오버플로우가 발생하면 1로 세팅된다. 또한, MSB(Most Significant Bit)가 변경되었을 때도 1로 세팅된다.

- CF(Carry Flag) : unsigned integer(부호 없는 수)의 오버플로우 발생시 1로 세팅

 

 

4) 명령어 포인터

EIP( Instruction pointer) : CPU가 처리할 명령어의 주소를 나타내는 레지스터.

 

CPU는 EIP에 저장된 메모리 주소의 명령어를 하나 처리하고 난 후, 자동으로 명령어 길이만큼 EIP를 증가시킨다. 이런 식으로 계속 처리해 나간다.

직접 변경 할 수 없다.

따라서 특정 명령어를 사용하거나 인터럽트, 예외를 발생시켜야 한다.

 

 

 

 

책에도 나와 있지만, 정말 어렵다. 이걸 다 달달 외우기 보다는 이게 이거구나 알고 있으면 앞으로 디버깅할때 도움이 될거 같아. 그래서 여기 정리했지.

 

'[Reversing]' 카테고리의 다른 글

[스택 Stack]  (0) 2017.08.15

다시이주

[주절주절] 2017. 8. 6. 12:30 Posted by 부르곰므

티스토리를 떠났던 부르곰므는

다시 슬슬 이주준비를 합니다

이번엔 좀 깔끔하게 꾸며보려합니다

'[주절주절]' 카테고리의 다른 글

블로그란  (0) 2017.11.20