리버싱 기초 지식 - Reversing,프로그램 실행 구조, Register, Stack, PE
리버싱 기초 지식
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를 가리키는 주소를 기록한다.