본문 바로가기

Reversing/Theory

Chapter 1. About Reverse Engineering

Chapter 1. About Reverse Engineering
1. Reverse Engineering
 - Reverse Engineering
  · Software 역 공학이라고 하며 Software, System 등의 구조, 기능, 동작 등을 분석하여 그 원리를 이해하며 단점을 보완하거나 새로운 아이디어를 추가하는 일련의 작업
  · Software적으로는 RCE(Reverse Code Engineering) 또는 Reversing이라고도 한다.
  · Reversing에서는 Source Code 없이 Software File의 Binary 자체를 분석한다.
 - Reverse Engineering Method of Analysis
  · Reversing의 분석방법으로는 정적 분석, 동적 분석이 있다.
  · 정적 분석으로는 정보 수집을 하면서 해당 Program의 구조와 동작원리에 대해 예측하고 이 예측을 통해 동적 분석에서 분석하며 아이디어를 제공한다.
  · 정적 분석과 동적 분석을 적절히 잘 활용하면 시간 단축 및 효과적인 분석이 가능하다.
  · 정적 분석
  ◦ Software를 실행하지 않고 겉모습을 분석하는 방법
  ◦ File의 종류, 크기, Header(PE) 정보, Import/Export API, 내부 문자열, 실행압축 여부, 등록정보, Debugging 정보, Digital Certification 등의 다양한 Software 정보을 확인하는 것
  ◦ Disassembly Language만을 이용해 내부 Code와 그 구조만을 확인하는 것도 정적 분석의 범주에 포함된다.
  · 동적 분석
  ◦ Software를 실행시켜 그것의 행위를 분석하고 Debugging을 통해 Code의 흐름, Memory 상태, Debugger를 통한 Program 구조, 동작 원리를 자세히 분석하는 방법을 말한다.
  ◦ File, Registry, Network 등을 관찰하며 Program의 행위를 분석하는 것
 - Code의 종류
  · 일반적으로 Code의 종류는 Source Code, Hex Code, Assembly Code로 나뉜다.
  · Source Code
  ◦ Software Execute File이 만들어지기 전 Compiler에 의해 Compile하기 전의 Code를 Source Code라고 한다.
  ◦ Utility : Visual Studio
  · Hex Code
  ◦ 일반적으로 Software Execute File는 Computer가 이해하기 쉬운 0과 1로 이루어진 2진수(Binary)로 이루어져 있는데 이를 조금 더 보기 편하게 16진수(Hex)로 바꾼 Code를 Hex Code라고 한다.
  ◦ Utility : HxD
  · Assembly Code
  ◦ Hex Code를 Disassemble 과정을 통해 변환한 Code를 Assembly Codef라고 한다.
  ◦ Utility : OllyDbg
 - Patch & Crack
  · Patch와 Crack은 작업하는 내용은 같을 수 있지만 목적이 윤리적이냐 비윤리적이냐에 따라서 달라지며 Reversing을 수행하는 사람에게는 윤리 의식이 필요하다.
  · Patch
  ◦ Program의 File 또는 실행 중인 Process Memory의 내용을 변경하는 작업
  ◦ 주로 Program의 취약점 수정과 기능 개선 등을 위해 수행하는 작업
  · Crack
  ◦ Program의 File 또는 실행 중인 Process Memory의 내용을 변경하는 작업으로 작업 내용은 Patch와 같지만 목적적으로 Patch와 정반대인 작업을 말한다.
  ◦ 주로 저작권을 침해하는 행위(불법 복제 및 사용 등)에 수행하는 작업

 

2. Debug Utility : OllyDbg
 - OllyDbg CPU 화면 구성

  · Code Window
  ◦ Disassembly Code를 표시하는 화면으로 각종 Comment, Label을 보여주는 화면
  ◦ Code를 분석할 때 사용가능하며 분석자가 확인할 수 있도록 Comment를 달 수 도 있다.
  · Register Window
  ◦ CPU의 Register 및 값을 표시하는 화면
  · Dump Window
  ◦ Process에서 원하는 Memory 주소 위치를 Hex와 ASCII/UNICODE 값으로 표시하는 화면
  ◦ Little Endian 방식을 사용자가 보기 쉽도록 보여준다.
  · Stack Window
  ◦ ESP Register가 가리키는 Process Stack Memory를 표시하는 화면
  ◦ 주소 값을 Absolute, ESP 기준, EBP 기준으로 표현가능하다.
 - EP(Entry Point)
  · Debugger로 실행 시 해당 Program의 실행 시작 주소를 말한다.
  · EP의 예

  ◦ Address : 해당 Program이 실행 시 Virtual Memory 상의 Process 주소
  ◦ CPU 명령어 : Instruction이라고도 하며 실제로 CPU에 내려지는 명령어(Op code)
  ◦ Disassembled Code : CPU 명령어를 확인하기 쉽도록 Assembly Code로 변환한 것
 - Main 함수 특징

  · wmain과 main 함수는 각각 인자를 3개씩을 갖기 때문에 PUSH 명령어가 사용된 후 CALL 명령어가 발생한다.
  · 즉 해당 Program에 Main함수가 존재한다면 PUSH 명령어 3개와 CALL명령어 1개가 연달아있는 명령어를 찾으면 보다 빨리 찾을 수 있다.
 - OIlyDbg 단축 명령어

명령어

단축키

설명

Restart

Ctrl + F2

 해당 Process를 종료하고 처음부터 다시 Debugging 시작

Step Into

F7

 하나의 OP code를 실행하며 CALL을 통해 함수를 만나면 해당 함수 내부로 진입

Step Over

F8

 하나의 OP code를 실행하며 CALL을 통해 함수를 만나면 해당 함수 내부로 진입하지 않고 함수 자체를 실행

Go to

Ctrl + G

 원하는 주소로 이동

 Code Window, Dump Window, Stack Window 모두에서 사용가능

Break Point

F2

 Break Point 설정 및 해제 

Execute till Return

Ctrl + F9

 함수 내부에서 실행해 RETN 명령어까지만 실행

Execute till Cursor

F4

 Cursor가 있는 위치까지 실행

Run

F9

 Break Point가 있는 지점까지 실행

 (Break Point가 없으면 해당 Process의 끝까지 실행)

Comment

;

 주석(Comment) 추가

Label

:

 Label(원하는 주소에 특정 이름) 추가

User-defined

Comment

Search for →

User-defined comment

 사용자 지정 주석(Comment) 목록 확인

User-defined
label

Search for →
User-defined label

 사용자 지정 Label(원하는 주소에 특정 이름) 목록 확인

Show the Current

EIP 

*

 현재 EIP 위치 표시

Show the previous
Cursor

-

 현재 Cursor 직전의 Cursor 위치를 다시 표시

Preview CALL/JMP

Address 

Enter

 Cursor가 CALL/JMP와 같은 이동 명령어에 위치 시 해당 명령어가 가리키는 주소를 따라가 보여준다.

All referenced 
text strings

Search for →
All referenced text strings

 Code에서 참조되는 모든 문자열 표시

All intermodular
calls

Search for →
All intermodular calls

 Code에서 호출되는 모든 API 함수 표시

Name in all 
modules

Search for →

Name in all modules 

 모든 API 함수 표시

Edit data

Ctrl + E

 Data 변집

Assemble

Space

 Assembly Code 작성

Copy to executable

Right Menu →
Copy to executable File

 File의 복사본 생성

 - 원하는 Code를 찾아내는 방법
  · Code 실행
  ◦ F8로 명령어 하나하나를 실행해 원하는 함수가 호출되는 지점을 찾는 방법
  ◦ 원하는 지점을 찾은 후 BP를 지정해 Ctrl + F2로 재실행을 하는 방법으로 여러 번 반복해야한다.
  · 문자열 검색
  ◦ 원하는 함수가 문자열을 가지고 있을 경우에 사용하는 방법
  ◦ Search for → All referenced text strings를 통해 Process 내의 모든 문자열을 확인 할 수 있다.
  · API 검색
  ◦ 해당 Process의 모든 API 목록을 확인하는 방법이다.
  ◦ Windows에서 Program을 통해 뭔가를 출력하기위해서는 Win32 API가 필요하며 뭔가가 출력이 된다면 이 API를 사용한 것을 알 수 있다
  ◦ Search for → Name in all modules 
  · API에 BP 설정
  ◦ 해당 Process에서 확인한 API에 Break Point를 설정해 해당 API의 동작을 확인하는 방법
  ◦ Search for → Name in all modules

 

'Reversing > Theory' 카테고리의 다른 글

Chapter 6. PE header I - PE Format  (0) 2015.08.16
Chapter 5. Calling Convention  (0) 2015.08.16
Chapter 4. Stack  (0) 2015.08.16
Chapter 3. Memory & Assembly Language  (0) 2015.08.16
Chapter 2. Register & Byte Ordering  (0) 2015.08.16