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 | Search for → | 사용자 지정 Label(원하는 주소에 특정 이름) 목록 확인 |
Show the Current EIP | * | 현재 EIP 위치 표시 |
Show the previous | - | 현재 Cursor 직전의 Cursor 위치를 다시 표시 |
Preview CALL/JMP Address | Enter | Cursor가 CALL/JMP와 같은 이동 명령어에 위치 시 해당 명령어가 가리키는 주소를 따라가 보여준다. |
All referenced | Search for → | Code에서 참조되는 모든 문자열 표시 |
All intermodular | Search for → | Code에서 호출되는 모든 API 함수 표시 |
Name in all | Search for → Name in all modules | 모든 API 함수 표시 |
Edit data | Ctrl + E | Data 변집 |
Assemble | Space | Assembly Code 작성 |
Copy to executable | Right Menu → | 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 |