Dakuo`slecture1

Report
Dakuo’s
Lecture
The Foundation of
Reverse Engineering
김종민(dakuo) /
부회장
[email protected]
What is the Reverse Engineering?
Reverse Engineering
• 이미 만들어진 대상을 역으로 추적하여 분석하는 기술
-> Point of view Software
• 대상 소프트웨어를 역으로 추적하여 내부동작 & 설계개념 분석
Contents
Ⅰ. A basic knowledge
Ⅱ. Binary Analysis
Ⅲ. Dynamic Analysis
Ⅳ. Static Analysis
Ⅴ. Technique
Ⅵ. Example
Ⅰ. A basic knowledge
1. Register & Memory
2. 프로그램 실행과정
3. Assembly
1. Register & Memory
- 범용 레지스터
•
EAX : 곱셈과 나눗셈 명령과 함수의 리턴값 저장.
•
EBX : ESI나 EDI와 결합하여 인덱스 표현.
•
ECX : 반복 명령어 사용시 카운터.
•
EDX : EAX와 같이 쓰이며 부호 확장 명령 등에 사용.
•
ESI : 데이터 복사나 조작 시 Source Data의 주소 저장.
•
EDI : 복사 시 Destination의 주소 저장.
•
ESP : 하나의 스택 프레임의 끝 지점 주소 저장에 사용.
PUSH, POP 명령어에 따라서 ESP의 값이 4byte씩 변한다.
•
EBP : 하나의 스택 프레임의 시작 지점 주소 저장.
현재 사용되는 스택 프레임이 소멸되지 않는 동안 EBP의 값은 변하지 않는다.
현재의 스택 프레임 소멸 시 이전에 사용되던 스택 프레임을 가리킨다.
1. Register & Memory
- 명령 포인터 레지스터
•
EIP : 다음에 실행해야 할 명령어가 존재하는 메모리 주소 저장.
•
순서 : 현재 명령어 실행완료 -> EIP에 저장되어 있는 주소에 위치한 명령어 실행
-> 명령어 실행 전 EIP에 다음 실행해야 할 명령어가 존재하는 주소값 저장.
- 세그먼트 레지스터 : 세그먼트(기준점) 오프셋(상대거리) 저장
•
CS(Code Segment) : 실행 가능한 명령어가 존재하는 세그먼트 오프셋 저장
•
DS(Data Segment) : 데이터가 존재하는 세그먼트 오프셋 저장
•
SS(Stack Segment) : 스택이 존재하는 세그먼트 오프셋 저장
- 플래그 레지스터 : Flag Setting
•
CF(carry), ZF(zero), OF(Overflow), SF(Sign), DF(Direction)
1. Register & Memory
바이트 순서(Byte Order)
- 리틀 엔디안(Little – Endian)
• 높은 주소에서 낮은 주소로 기록
• Intel Processor 사용
- 빅 엔디안(Big – Endian)
• 낮은 주소에서 높은 주소로 기록
• Risc Processor 사용, 네트워크 프로토콜에서 사용
1. Register & Memory
메모리(RAM)
프로세스 가상메모리 (32BIT 환경 -> 4GB 할당)
• 유저 영역(2GB) :
00000000 ~ 7FFFFFFF
• 커널 영역(2GB) :
80000000 ~ FFFFFFFF
1. Register & Memory
PE(Portable Executable) 섹션
• .text : 프로그램을 실행하기 위한 코드 섹션
• .rdata : 읽기 전용 데이터 섹션 (문자열)
• .data : 초기화된 전역 변수 존재. 읽고 쓰기 가능한 섹션
• .idata : Import 할 DLL, API 정보를 담고 있는 섹션
IAT(Import Address Table)가 존재
• .rsrc : 리소스 데이터 존재
(절대적인 값이 아니며 프로그래머가 변경 가능)
1. Register & Memory
유저 영역 메모리
2. 프로그램 실행 과정
Fetch -> Decode -> Execute
• Hard Disk(Program) -> RAM(Process)
• Fetch : RAM -> Register ->
• Decode : Register -> Control Unit ->
• Execution : Control Unit -> ALU
3. Assembly
명령어
뜻
사용법
CALL
호출
CALL operand
PUSH
PUSH
PUSH operand / PUSHAD (레지스터 값 보관)
POP
POP
POP Destination / POPAD (레지스터 값 복원)
MOV
값 복사
MOV Destination, Source : des = sou
LEA
주소 복사
LEA Destination, Source : des = sou
CMP
비교
CMP operand, operand : 같으면 ZF Set
J– ( jump) 조건성립 시 이동
J– operand
NOP
아무 일도 안함
NOP
RETN
리턴
RETN,
RETN operand
3. Assembly
명령어
뜻
사용법
INC
+1
INC operand
DEC
-1
DEC operand
ADD
+
ADD Destination, Source : des = des + sou
SUB
-
SUB Destination, Source : des = des – sou
MUL
*
MUL operand : eax = eax * oper
DIV
/
DIV operand : eax = eax / oper
AND
1, 1 -> 1
AND Destination, Source : des = des & sou
OR
0, 0 -> 0
OR Destination, Source : des = des | sou
XOR
같으면 0, 다르면 1
XOR Destination, Source : des = des ^ sou
3. Assembly
콜링 컨벤션(Calling Conventions)
: 함수의 파라미터의 전달과 해제에 대한 규약
-
_cdecl
•
•
•
C, C++ default
파라미터 전달 <파라미터 해제는 프로시저를 호출한 것이 책임
-
_stdcall
•
•
•
Windows API 프로시저 default
파라미터 전달 <파라미터 해제는 프로시저 복귀 전에 이뤄짐
Ⅱ. Binary Analysis
1. Binary
2. String
3. Module
1. Binary
•
HEX-Editor : 파일 헤더 분석, 바이너리 수정
1. Binary
•
PEID : PE 헤더 분석(exe, dll)
2. String
• Strings : string 추출 툴
strings target.exe > save.txt
3. Module
•
Dependency Walker : Module의 의존성 검사
3. Module
•
PE Explorer : 실행파일 정보 분석
Ⅲ. Dynamic Analysis
•
통제된 환경에서 프로그램을 실행시켜
모니터링을 통해 분석
Ⅲ. Dynamic Analysis
•
Process Monitor :
•
Process Explorer :
•
RegMon :Registry monitor
•
TCP View : Port monitor
•
WireShark : Packet monitor
• Process Monitor
• Process Explorer
• RegMon
• TCP View
• WireShark
Ⅳ. Static Analysis
• 프로그램을 실행시키지 않고
소스코드와 디버깅을 통해 분석
Ⅳ. Static Analysis
• OllyDBG
• IDA
• OllyDBG
E
Restart (Ctrl + F2)
M
Memory Map
Run (F9)
T
Threads
Pause (F12)
H
Handles
Step Into (F7)
C
CPU
Step Over (F8)
K
Call Stack
Executable Modules
B
Break Points
• OllyDBG
1. disassem
2. register
3. dump 4. stack
• OllyDBG
1. disassem menu
• OllyDBG
2. register menu
• OllyDBG
3. dump menu
• OllyDBG
4. stack menu
• OllyDBG
Detail
• OllyDBG
1. Address : 주소값
2. Opcode : 명령어
3. Assembler Code : 디스어셈블된 코드
4. Olly Analysis : Olly가 분석한 내용
5. Comment : 사용자 주석
6. Value : 변수 표시
7. Hex Dump : 16진수 바이너리
8. Register & Flag : 레지스터와 플래그 값 표시
• OllyDBG
단축키
•
Edit Assemble : Double Click
•
Comment : ;
•
Go to Address : Ctrl + G
•
Search for Command : Ctrl + F
•
Search for (label) View Name : Ctrl + N
•
Follow in Disassembler : Enter
•
Go to Previous : -
• OllyDBG
디버깅 단축키
•
Run : F9
•
Restart : Ctrl + F2
•
Step Into : F7
•
Step Over : F8
•
Execute till Return : Ctrl + F9
•
Pause : F12
•
Break Point : F2
• IDA
• IDA
1. Menu bar
2. Toolbar
9. Code Location
: 분기점 표시
3. Subview
10. Code Reference
4. Window
: 분기점으로 이동
5. Jump
11. Disassem Code
6. Virtual Address
12. Cursor Disassem Code
7. Stack Pointer
8. Opcode
• IDA
SubView
• IDA
디버깅 모드
• IDA
1. Break Points
2. IDA View - EIP
3. Registers
4. Flags
5. Threads
6. IDA View - ESP
7. Menu bar
• IDA
단축키
•
Space : Text view <-> Layout Graph
•
Ctrl + P : Choose function to jump to
•
G : Jump to address
•
Ctrl + I : Choose a name
•
Alt + T : Text search
•
Shift + F12 : Strings Window
• IDA
디버깅 모드 단축키
•
Break Point : F2
•
Run : F9
•
Debugging Exit : Ctrl + F2
•
Step Into: F7
•
Step Over : F8
•
Calculator : Shift + /
Ⅴ. Technique
1. Back to User Mode
2. Search for
3. Cross References
4. Executable Modules
1. Back to User Mode
• 특정 이벤트가 발생하기 전에 설정한 후,
이벤트를 발생시켜 Call 다음 위치를 잡는 기술
ex. scanf(), MessageBox() ......etc...
• 사용법 : OllyDBG 이용
1. 이벤트 전에서 pause 를 건다.
2. Alt + F9 로 back to user mode 를 설정한다.
3. 이벤트를 발생시킨다.
1. Back to User Mode
1. OllyDBG 실행
2. Run (F9)
3. 이벤트 발생 전
1. Back to User Mode
4. Pause (F12)
5. Back to User Mode (Alt + F9)
6. Event Execute
7. Success
2. Search for
• 여러 검색을 통해 원하는 정보를 획득
ex. All referenced text strings,
Name (label) in current module (Ctrl + N), etc...
• 사용법 : OllyDBG 이용
1. Disassem menu -> Search for
2. Choose
2. Search for
1. OllyDBG 실행
2. Disassem Menu -> Search for
-> All referenced text strings
3.
4. Success
3. Cross References
• 함수가 사용된 곳을 교차하여
참고할 수 있게 표시를 해주는 것
(어떤 함수가 어디에서 또 쓰였는지를 찾기 쉽도록 표시를 해준다)
• 사용법 : IDA 이용
1. 함수로 이동
2. SubView -> Cross References
3. Choose
3. Cross References
1. IDA 실행
2. 함수로 이동
3. Cross References
3. SubView -> Cross References
4.
5. Success
4. Executable Modules
• 같이 로딩 되는 실행 가능한 모듈을 출력
(용도 : 모듈을 골라서 중요한 코드에 Break Point 를 걸어
해당 코드가 실행될 때, 제어권을 받아온다)
ex. Dll, Module, ......etc...
• 사용법 : OllyDBG 이용
1. Alt + E
2. Choose
4. Executable Modules
1. OllyDBG 실행
2. Alt + E
3.
4. Success
Ⅵ. Example
- practice.exe 분석 -
Q&A
Thanks
도와주신 분들
hkpco,
onesider

similar documents