1. 실행 파일(Excutable File)
- 명령어에 의해서 특정 작업을 수행할 수 있도록 생성된 파일(Code, Data 포함되어 있음)
- Windows PE(Portable Exectable)
- Linux ELF(Excutable & Linkable Format)
- MAC Mach-O(Mach Object File Format)
2. 프로그램 & 프로세스 & 프로세서 & 쓰레드
- 프로그램 : 작업을 수행하기 위해서 명령어/데이터들이 포함되어 있는 실행 파일
- 프로세스 : 작업을 수행하기 위해서 메모리에 올라간 프로그램 단위 (Ex : 일꾼)
- 프로세서 : 메모리에 올라간 프로세스를 처리하는 CPU
- 쓰레드 : 생성된 프로세스에서 처리 및 흐름 과정을 담당하는 프로세스 안에 또 다른 프로세스 (Ex : 일꾼의 손 개수)
3. PE 파일
- Windows에서 사용하는 실행 파일 형식
- 원본 디렉토리 뿐만 아니라 다른 디렉토리로 이동해도 실행이 가능한 특징을 갖고 있다.
- 별도의 프로그램 설치 및 관계된 파일이 없어도 윈도우에서 실행 가능
- 프로세스 적재을 위한 정보 분석
- API 호출을 위한 IAT 분석
- 코드 사이즈/섹션 위치 분석
- 패킹/언패킹 유무 분석
- 악성 코드 분석
4. 가상 메모리
- 프로세스와 메모리 공간을 관리하기 위해서 운영체제가 사용하는 논리적인 메모리이다.
- 모든 프로세스는 자신만의 가상 메모리를 갖고 있으며, 32bit/64bit 프로세스 각각 4G/8G 공간이 할당된다.
- 운영 체제 규칙에 의해서 실제 물리 메모리 주소와 가상 주소를 매핑한 이후 해당 영역을 사용한다.
- 이때, 서로 다른 프로세스의 가상 주소가 물리 메모리 주소로 매핑될때 중첩 및 침범되지 않는다.
5. 메모리 주소
- 절대 주소
- 메모리 관리자 입장에서 보는 물리 주소를 의미한다.
- 즉, 메모리 레지스터가 사용하는 주소이며, 컴퓨터에 장착된 메모리(램)의 실제 주소이다.
- 상대 주소
- 사용자 프로세스 입장에서 보는 가상 주소를 의미한다.
- 사용자 영역이 시작되는 번지를 0번지로하여 사용한다.
- 메모리 관리자(재배치 레지스터)
- 실제 메모리 내의 절대 주소를 상대 주소로 변환하는 작업을 처리한다.
- 경계 레지스터
- 메모리를 사용할때는 다음과 같이 운영체제 영역과 사용자 프로그램 영역으로 구분된다.
- 이때, 사용자 영역이 운영체제 영역으로 침범하지 않도록 경계 레지스터가 경계 지점의 주소를 저장하여 검사한다. (사용자 프로그램의 주소들이 현재 기준보다 높은 주소인지를 검사한다.)
- 만약, 사용자 영역이 운영 체제 영역을 침범한다면 해당 프로세스를 종료한다.
6. Image Base & RVA & VA
- Image Base
- PE 파일이 메모리에 로드되는 가상 주소이다.
- 이 영역은 PE 파일마다 예약된 범위가 있다.
- RVA
- Relative Virtual Address
- PE 파일이 가상 주소 공간 내에 로드된 이후, 이미지의 시작 주소에 대한 상대 주소이다.
- 즉, PE 파일이 메모리에 로드된 이후, Image Base 기준으로 계산된 특정 위치를 의미한다.
- PE 파일 시작 주소에서 어느정도 떨어져 있는지를 측정할 수 있다.
- RVA = VA - ImageBase 주소
- VA
- Virtual Address
- 가상 메모리 주소 공간에 프로세스의 절대 주소이다.
- 즉, PE 파일이 메모리에 로드된 이후, 0번지(0x0000000) 부터 계산된 특정 위치를 의미한다.
- VA = ImageBase 주소 + RVA 주소
7. ASLR
- Address space layout randomization
- 메모리 보호 기법
- 프로그램이 메모리에 로드되는 주소(Image base)를 랜덤으로 변경하는 기능이다.
- 실행 파일이 로드될때 ImageBase에 다른 것이 로드되어 있다면, 다른 주소를 찾아서 로드하여 중첩 문제를 해결한다.
8. API
- Application Programming Interface
- 운영체제, 프로그램 언어가 응용 프로그램에서 사용할 수 있도록 기능을 제공하는 인터페이스(함수)이다.
- MSDN 문서 검색 참조
9. 컴파일
- 모든 헤더와 소스 파일 내용을 합쳐서 하나의 기계어 코드를 생성하는 기능을 수행한다.
- 또한, 소스 코드에 오류가 있는지를 검사한다.
[컴파일러] [링커]
소스 코드 > Object Code > 실행 파일
(1010101011...)
10. DLL
- Dynamic Linked Library
- 프로그램들이 동시에 사용할 수 있는 코드, 데이터, 함수를 포함한 라이브러리이다.
- DLL을 사용하면 디스크/메모리에 로드되는 중복된 코드를 최소화, 리소스 사용 최소화, 다른 프로그램 성능을 향상시킬 수 있다.
11. Static Linking & Dynamic Linking
- Static Linking
- 컴파일 진행시 함수가 링커에 의해서 실행 파일에 연결되는 방식이다.
- 실행 파일에 함수의 코드가 복사되므로 파일 크기가 증가된다.
- 실행 파일에 함수 코드가 포함되기 때문에 완전한 단독 실행 파일로 생성된다.
- 그렇기 때문에 컴파일이 끝나면 라이브러리 파일이 필요없다.
- Dynamic Linking
- 프로그램 실행시 함수가 연결된다.
- 컴파일 진행시 호출할 함수의 정보만 포함하고 실제 함수 코드 정보는 포함되지 않는다.
- 그렇기 때문에 파일 크기가 증가되지 않는다.
- 단, 실행 파일에서 사용할 함수를 갖고 있는 라이브러리 파일이 꼭 있어야 한다.
12. DLL 로드 방식(Dynamic Linking 해당)
- 명시적 링킹
- 프로그램에서 필요한 시점에 DLL/함수 정보를 로드하고 사용한 이후 해제한다.
- 다음과 같은 3개의 함수를 이용하여 DLL를 로드한다.
- LoadLibrary() 필요한 DLL을 프로세스 가상 메모리에 매핑/로드하는 함수(DLL 불러옴)
- GetProcAddress() DLL 함수의 포인터/주소를 획득하는 함수(DLL로부터 함수를 불러옴)
- FreeLibrary() 프로세스 가상 메모리에서 DLL를 반환/언로드하는 함수(DLL 해제함)
- 암시적 링킹
- 실행 파일 자체에서 사용할 DLL과 함수 정보를 포함한 이후 프로그램 실행시 로드한다.
- 즉, 프로그램이 시작되면서 해당 DLL를 바로 로드하는 방식이다.
- PE 로더가 PE 파일 안에 있는 함수 내용/목록을 확인하여 DLL 파일을 메모리에 로드한다.
13. OllyDbg
- 프로그램을 분석할때 사용하는 디버거이다.
- 올리디버거로 실행 파일을 오픈하면 Address of Entry Point(프로그램 코드 시작)에서 시작한다.
- 선수 지식 : 어셈블리어, PE 파일 구조, DLL 기본 개념, 메모리 주소 관련
F8 | 코드 한줄 실행 |
F4 | 마우스로 선택한 주소까지 이동 |
F9 | 코드 전체 실행 |
Ctrl+F2 | 프로그램 재실행 |
F2 | 브레이크 포인트 지정 (한번더 누르면 해지) |
F7 | 함수 내부 진입 |
Ctrl+g | 주소 이동(코드 윈도우, 메모리 윈도우 각각 사용 가능) |
* | 현재 위치로 이동(즉, EIP에 저장된 주소로 이동함) |
- 코드 영역에서 스페이스 or 마우스 더블클릭을 실시하면 코드를 변경할 수 있다.
- 다음과 같이 설정하면, 스택을 EBP 기준으로 확인할 수 있다. (매번 해야한다.)
- 스택 -> 좌측 주소 선택 -> 마우스 우클릭 -> Address -> Relative eo EBP
'메가IT아카데미 국기과정 > 리버싱과 악성코드 분석' 카테고리의 다른 글
[1-5] PE 파일 분석(RVA to RAW) (0) | 2022.09.13 |
---|---|
[1-4] PE 파일 분석(RVA to VA) (0) | 2022.09.13 |
[1-3] PE 파일 분석(섹션 헤더) (0) | 2022.09.13 |
[1-2] PE 파일 분석(PE 헤더) (0) | 2022.09.13 |
[목차] 리버싱과 악성코드 분석 (1) | 2022.09.11 |