Reverse 01

2017. 2. 26. 01:24Hobby/Reverse

728x90

리버싱을 위한 프로그램 실행 구조

- CPU

-- 제어장치

-- 연산장치

-- 레지스터

--- 범용 레지스터

1. EAX (Extended Accumulator Register) : 곱셈과 나눗셈 명령에서 사용, 함수의 반환값 저장

2. EBX (Extended Base Register) : ESI 나 EDI와 결합해 인덱스에 사용

3. ECX (Extended Counter Register) : 반복 명령어를 사용할 때 반복 카운터 저장, ECX 레지스터에 반복할 횟수를 지정해 놓고 반복 작업 수행

4. EDX (Extended Data Register) : EAX와 같이 사용되며 부호 확장 명령 등에 활용

5. ESI (Extended Source Index) : 데이터 복사 또는 조작할 때 소스 데이터 주소가 저장, ESI 레지스터가 가리키는 주소에 있는 데이터를 EDI 레지스터가 가리킨느 주소로 복사하는 용도로 사용

6. EDI (Extended Destination Index) : 복사 작업을 할 때 목적지 주소가 저장, 주로 ESI 레지스터가 가리키는 주소의 데이터가 복사

7. EBP (Extended Base Pointer) : 하나의 스택 프레임의 시작 주소가 저장, 현재 사용되는 스택 프레임이 살아 있는 동안 EBP의 값은 변하지 않음, 현재 사용한 스택 프레임 사라지면 이전 사용되던 스택 프레임 가리킴

8. ESP (Extended Stack Pointer) : 하나의 스택 프레임의 끝 지점 주소가 저장, PUSH, POP 명령어에 따라서 ESP의 값이 4바이트씩 변한다.

9. EIP (Extended Instruction Pointer) : 다음에 실행할 명령어가 저장된 메모리 주소가 저장, 현재 명령어 모두 실행 후 EIP 레지스터에 저장된 주소에 있는 명령어 실행, 실행 전에 EIP 레지스터에는 다음 실행해야 할 명령어가 있는 주솟값 저장

-> 32비트 레지스터는 용도에 따라서 8비트 단위로 나누어 사용, EAX 레지스터는 하위 16비트만 AX 레지스터라는 이름으로 사용, 8비트 단위로 상위 8비트는 AH 레지스터, 하위 8비트는 AL 레지스터 라는 이름으로 사용할 수 있다.

-> CPU 에서 사용하는 고속의 기억장치

- Memory (PE, Portable Executable : 실행파일)    <- Loader

-- Code

-- Data

-- Heap

-- Stack

- HDD (PE)    <- Loader

-- Header(PE 정보)

-- Body(PE 코드)

- Entry Point 

-> PE 파일 실행 시작 주소

- Context Switching

-> CPU가 끝나고 사용 권한 넘겨줄때 자신이 사용하고 있던 모든 레지스터를 메모리 영역으로 복사


스택 (Stack)

- 스택 포인터

-> 스택의 위치, ESP 레지스터에 저장 

-> 메모리의 한 부분으로 LIFO(Last Input First Ouput) 방식으로 동작, POP과 PUSH 두 가지 동작 지원


스택 프레임 (Stack Frame)

-> 서브 루틴(함수)이 가지는 자신만의 스택 영역, 서브루틴 내부에서 사용하는 데이터가 저장, 함수 호출시 스택 프레임 생성, 함수 종료시 소멸

_서브 루틴 : 필요한 인자들을 먼저 스택으로 입력, 실행하기 바로 직전에 운영체제는 다시 돌아올 주소인 복귀 주소를 스택으로 집어 넣음, 이전 루틴이 사용했던 EBP 레지스터 내용을 백업, EBP 레지스터가 백업된 위치의 스택 주소를 서브루틴의 EBP에 다시 집어 넣음, EBP는 스택 프레임에서 데이터 참조를 위한 기준 주소인 프레임 포인터(Frame Pointer)로 사용, 변하지 않는 EBP를 사용해서 스택에 접근

728x90

'Hobby > Reverse' 카테고리의 다른 글

Reverse 02  (0) 2017.02.27
Reverse 01  (0) 2017.02.26