본문 바로가기

2. Reversing (리버싱)/2) 개념 정리

[ 2021.09.04 ] 01. 리버싱을 위한 기초 지식

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

 

컴퓨터의 구성 3요소 : CPU, 메모리, 하드디스크

 

실행파일 = PE파일 { 헤더 - 중요정보 저장

(기본정보와           { 보디 - 코드와 데이터 저장

배치정보를 담고있음)   

로더가 헤더의 중요정보를 분석하고 보디에 있는 코드와 데이터들을 메모리에 배치한다.

 

메모리 - 코드 영역 : 프로그래 코드 저장

          - 데이터 영역 : 정적 변수, 전역 변수

          - 스택 영억 : 매개 변수, 지역 변수

          - 히프 영역 : 동적 메모리 할당

코드 영역과 데이터 영역은 프로그램 로딩시 사용되고 스택 영역과 히프영역은 프로그램 실행시 사용된다.

C언어는 MAIN()함수부터 프로그램을 실행하는 것처럼 PE 파일은 엔트리 포인트 위치부터 프로그램을 실행한다.

 

명령어 실행 : CPU에 있는 제어장치, 연산장치 ( 프로그램 실행에 필요한 데이터는 레지스터에 존재해야함 ) ( 메모리에 있는 데이터를 레지스터로 복사하는 과정 必 )

 

2. 레지스터

 

*여기서 레지스터란?

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

메모리에 있는 데이터를 레지스터로 가지고 옴 ( 연산 중간중간 데이터를 저장 )

 

접두어 E - 32비트라는 뜻

접미어 X -레지스터(역할)

접미어 I - 인덱스(역할)

접미어 -포인터(역할)

 

EAX= 명령에 사용, 함수의 리턴값 저장.

EBX= ESI나 EDI와 결합하여 인덱스에 사용.     
ECX= 반복 명령어 사용 시  반복 카운터 저장, 반복 작업 수행.

EDX= 부호 확장 명령 등에 활용.

ESI= 데이터 복사 및 조작 시 소스 데이터 주소 저장.

EDI= 복사시 목적지 주소 저장됨.     

EBP= 스택 프래임의 시작 주소가 저장. 스택 프래임 존재하는 한 EBP 불변, 사라지면 이전 사용되던 스택 프레임 가르킴.

ESP= 스택 프레임의 끝 주소 저장. 

EIP= 다음에 실행할 명령어의 메모리 주소를 저장. 현재 명령어 실행 다음에는 EIP 레지스터에 저장된 주소에 있는 명령어를 실행.

 

컨텍스트 스위칭 : CPU 사용이 끝난 뒤 다른 프로그램에 CPU 사용 권한을 넘겨줄 때 사용하고 있는 모든 레지스터 메모리 영역으로 복사하는 것

 

3. 스택과 스택 프레임

 

스택 : 메모리의 한 부분 , LIFO 방식 ( LAST INPUT FRIST OUTPUT ) : 가장 마지막에 들어간 데이터가 맨 처음으로 나오는 방식 ( 한 방향으로만 데이터가 쌓임 )

* POP 명령어 : 데이터를 꺼내는 동작 ( 주소가 4바이트만큼 증가 )

* PUSH 명령어 : 데이터를 꺼내는 동작 ( 주소가 4바이트만큼 감소)

 

스택 프레임 : 서브루틴(함수)이 가지는 자신만의 스택 영역 , 함수가 호출될떄 형성됨, 종료하고 복귀주소로 돌아갈 때 스택 프레임 소멸

1. 서브루틴을 호풀할 떄 필요한 인자들을 스택에 입력

2. 서브루틴 실행 직전 복귀주소를 스택에 삽입

3. 스택 프레임 시작, EBP레지스터에 내용을 백업 EBP는 데이터 참조 기준을 위한 기준 주소인 프레임 포인터로 사용되는 것.

 

4. PE파일

 

PE 파일 : 기계어가 파일로 만들어진 것, 윈도우 운영체제에서 사용하는 실행파일 

             최소 1개 이상 섹션 헤더, 최소 1개 이상 섹션 데이터 영역

 

- 헤더 : 파일 구성에 관련된 정도

          내가 찾는 데이터가 어디에 있는지 헤더에 있는 정보로 찾을 수 있음

* 주소 형식 { PFILE - PE파일 내부에서의 오프셋 값을 의미 > 물리적으로 하드디스크에 저장 됐을 때 의미 有

                { RVA - PE 파일이 메모리로 로드 됐을 때 저장되는 상대 주소 > PE파일이 메모리에 로드 됐을 때 의미 有

                { VA - 가상 메모리상에서 저장되는 실제 주소 > PE파일이 메모리에 로드 됐을 때 의미 有

-데이터 부분 : 프로그램에서 사용되는 코드와 프로그램이 사용하는 데이터

 

PE파일에는 DLL을 사용할 수 있도록 지원하는 IAT정보를 포함

* DLL( Dynamic Linking Library ) : 프로그램에서 필요한 라이브러리를 사용 시점에 동적으로 연결한다는 것. 컴파일 시점에 모든 기능을 실행 파일에 넣는 것은 효율성이 떨어져 동적으로 연결하는 기능 사용. 

IAT : PE 파일 안에 어떤 라이브러리의 어떤 함수를 가져다 쓰는지 기록해 놓은 정보

       로더가 IAT에 기록되어있는 API 이름을 참조해 실제 주소를 찾아 IAT안에 주소를 적어두는 방식

 

5. OllyDbg 기본 기능

 

1. 프레임 - 외부 골격 형성. 어떤 프로그램의 무슨 모듈을 디버깅 하고 있는지 표시

2. 메뉴 바- 제공 기능을 담음. 다양한 기능 설정 가능

3. 퀵 링크 - 자주 사용되는 기능을 아이콘 형태로 제공

4. 뷰 영역 - 분석 화면을 보여줌

5. 상태 바 - 현재 진행 중인 작업 표시 < paused : 단계적으로 디버깅 하는 상태 

                                                 < running : 사용자의 입력을 기다리는 상태

                왼쪽 : 어떤 동작을 수행하는지 표시, 오른쪽 : 디버깅의 실행 상태 표시