Search

'[Reversing]'에 해당되는 글 2건

  1. 2017.08.15 [스택 Stack]
  2. 2017.08.15 [IA-32 레지스터]

[스택 Stack]

[Reversing] 2017. 8. 15. 16:01 Posted by 부르곰므

 스택은 로컬 변수 저장, 함수 파라미터 전달 등 다양한 용도로 사용된다고 해. 디버깅 하면서 이 스택 메모리를 자주 확인 하게 된대. 그래서 스택에 대해서 조금 알아보려고.

 

 프로세스(Process)에서 스택의 역할은 함수 내부의 지역 변수 임시저장, 함수 호출 시 파라미터 전달, 복귀 주소 저장이 있지. 이런 일을 하기 위해 스택이 가장 유용하게 생각한 메모리 구조는 FILO-선입후출 방법이야.

 ESP의 초기 값은 스택의 Bottom에 가깝다고 해.

 PUSH 명령으로 스택에 값이 추가되면, 포인터는 TOP을 향해, 그러니깐 위로 움직이지. 이때, POP명령에 의해 스택에서 값이 제거되면, 스택 포인터는 Bottom을 향해 움직인대.

 그러니깐 밑에서 부터 쌓는거지.

 

 

 

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

[IA-32 레지스터]  (0) 2017.08.15

[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