DongDD's IT

리버싱 기초 지식 - Reversing,프로그램 실행 구조, Register, Stack, PE 본문

IT 보안/Reversing

리버싱 기초 지식 - Reversing,프로그램 실행 구조, Register, Stack, PE

DongDD 2017. 12. 4. 17:12

리버싱 기초 지식


Reversing


- Reverse Engineering(역공학)이라고 불림

- 어떤 장치나 시스템 등의 구조, 기능, 동작을 분석하고 원리를 이해하여 단점을 보완하고 새로운 아이디어를 추가하는 작업을 의미한다.


분석 방법

1) 정적 분석

- 실행 단계가 아닌 파일에 대한 여러 정보를 가지고 분석하는 방법

- 디스어셈블러를 통해 내부 코드와 구조를 확인하는 것도 포함된다.

2) 동적 분석

- 파일을 실행시킨 후 동작을 분석하는 방법

- 파일이 실행되면서 변화되는 여러 정보를 파악한다.

- Debugger를 통해 프로그램 내부 동작 원리를 분석한다.


컴퓨터의 기본 구성요소


1) CPU

2) Memory

3) Hard disk : 실행 가능한 파일(exe)이 저장됨

-> 윈도우에서는 실행 파일을 PE(Portable Executable)파일이라고 부른다.


Register


1) EAX : 연산과 함수 반환 값에 사용되는 레지스터

2) EBX : ESI, EDI와 결합해 인덱스에 사용되는 레지스터

3) ECX : Loop counter에 사용되는 레지스터

4) EDX : 부호확장에 사용되는 레지스터

5) ESI : 데이터 복사 작업, 조작을 할 때 Source data address가 저장되는 레지스터

6) EDI : 데이터 복사 작업을 할 때 Destination address가 저장되는 레지스터

7) EBP : 하나의 스택 프레임 시작 주소가 저장되는 레지스터(스택 프레임이 소멸되면 이전에 사용되던 스택 프레임을 가리킴)

8) ESP : 하나의 스택 프레임의 끝 주소가 저장되는 레지스터(PUSH, POP 연산에 의해 4byte씩 바뀐다.)

9) EIP : 다음으로 실행할 명령어의 주소가 저장되는 레지스터


Stack, Stack Frame


Stack

- LIFO(Last Input First Output)방식으로 동작하는 자료구조로 stack에 data를 넣는 PUSH opeartion과 stack에 있는 data를 꺼내는 POP operation이 있다.

- Stack은 다른 메모리 구조와 달리 거꾸로 저장된다.(먼저 저장되는 것의 메모리 주소가 더 크다.)

-> Why? Stack 구조 위에 있는 Data는 중요한 역할을 하기 때문에 size가 커지는 stack이 이 영역을 침범할 수 없게 하기 위해

- PUSH : ESP가 4bytes 감소한다. (stack 주소 4bytes 감소)

- POP : ESP가 4bytes 증가한다. (stack 주소 4bytes 증가)

Ref) 각 영역에 대한 설명 : http://dongdd.tistory.com/36



Stack Frame

- 서브루틴(함수)가 가지는 자신만의 스택 영역을 의미한다.

- 함수 호출 시 stack frame을 생성하고 함수 종료 시 생성되었던 stack frame이 소멸된다.

- 함수 실행 전에 복귀할 주소를 미리 스택에 집어넣고 이전 루틴의 EBP를 백업한다.

- EBP가 백업된 위치의 스택 주소를 다시 서브루틴의 EBP에 넣고 EBP를 데이터 참조를 위한 프레임 포인터로 사용한다.

- EBP를 유지한 채 ESP를 이용해 스택을 사용한다. 


PE(Portable Executable)


- 윈도우용 실행 파일을 의미한다.


PE File Format

구성요소

1) Header : 파일 실행을 위한 기본 정보, 메모리 저장 위치 등 중요한 정보들을 저장하고 있다.

2) Body : Code와 data가 저장되어 있다.


- Loader가 Header의 정보들을 분석해 Body를 메모리에 배치한다.

- 크게 PE header, Section header, Section data로 구성되어 있다.


PE Header

1) IMAGE_DOS_HEADER : DOS에서 윈도우용 PE파일 실행 시 오류 메시지를 보여주고 실제 윈도우용 PE 헤더 위치를 가리킨다.

2) MS-DOS Stub Program : DOS에서 윈도우용 PE파일 실행 시 출력해줄 오류 메시지를 저장하고 있다.

3) IMAGE_NT_HEADERS : 4bytes의 Signature와 IMAGE_FILE_HEADER, IMAGE_OPTIONAL_HEADER를 가지고 있음

-> IMAGE_OPTIONAL_HEADER

① Image Base : 메모리에 PE 파일이 저장되는 시작 주소

② Address of Entry Point : 프로그램 실행에 대한 제어권이 커널 영역에서 코드 영역으로 처음 넘어오는 주소인 Entry point를 가리킨다.(PE 파일의 시작 주소)

③ Base of Code : 코드 영역이 시작되는 주소인 RVA를 가리킴


Section Header

- 각 섹션 데이터를 메모리에 로딩하고 속성을 설정할 때 필요한 정보를 담고있음


Section

- PE 파일이 가상 주소 공간에 로딩된 후 프로그램 실행코드, 데이터, 리소스 등의 정보를 배치한 영역

1) Code

- .text : 프로그램 실행 코드 섹션

2) Data

- .data : 읽기 쓰기가 가능한 데이터 섹션으로 전역변수, 정적변수가 위치함

- .rdata : 읽기 전용 데이터 섹션으로 상수형 변수, 문자열 상수가 위치함

- .bss : 초기화되지 않은 정역변수가 위치함

3) Import API

- .idata : import할 DLL과 API/함수들에 대한 정보를 담고 있는 섹션(IAT)

- .didat : 지연 로딩 import data를 위한 섹션

4) Export API

- .edata : export할 DLL과 API/함수들에 대한 정보를 담고 있는 섹션

5) Resource

- .rsrc : dialog, icon, cursor 등의 윈도우 어플리케이션 리소스 관련 데이터들을 담고 있는 섹션

6) Relocation

- .reloc : 실행 파일에 대한 기본 재배치 정보를 담고 있는 섹션



주소 지정 방식

1) pFile : PE 파일 내부에서의 Offset

2) RVA : PE 파일이 메모리로 로드될 때 저장되는 상대 주소

3) VA : 가상 메모리상에서 저장되는 실제 주소


IAT(Import Address Table)

- DLL(Dynamic Linking Library)를 사용할 수 있게 지원해주는 역할을 한다.

- 실행 파일에 어떤 라이브러리의 어떤 함수를 사용하는지 기록

- Loader는 IAT에 기록된 API를 참조해 실제 주소를 찾아 IAT에 해당 API를 가리키는 주소를 기록한다.

Comments