610 likes | 903 Views
Dakuo ’ s Lecture. The Foundation of Reverse Engineering. 김종민 ( dakuo ) / 부회장 hkdakuo@gmail.com. What is the Reverse Engineering?. Reverse Engineering 이미 만들어진 대상을 역으로 추적하여 분석하는 기술 -> Point of view Software 대상 소프트웨어를 역으로 추적하여 내부동작 & 설계개념 분석. Contents.
E N D
The Foundation ofReverse Engineering 김종민(dakuo)/ 부회장 hkdakuo@gmail.com
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 • Register & Memory • 프로그램 실행과정 • 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 콜링컨벤션(Calling Conventions) : 함수의 파라미터의 전달과 해제에 대한 규약 • _cdecl • C, C++ default • 파라미터 전달 <- • 파라미터 해제는 프로시저를 호출한 것이 책임 • _stdcall • Windows API 프로시저 default • 파라미터 전달 <- • 파라미터 해제는 프로시저 복귀 전에 이뤄짐
Ⅱ. Binary Analysis • Binary • String • 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
Ⅳ. Static Analysis • 프로그램을 실행시키지 않고 소스코드와 디버깅을 통해 분석
Ⅳ. Static Analysis • OllyDBG • IDA
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 • Address : 주소값 • Opcode : 명령어 • Assembler Code : 디스어셈블된 코드 • Olly Analysis : Olly가 분석한 내용 • Comment : 사용자 주석 • Value : 변수 표시 • Hex Dump : 16진수 바이너리 • 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 • Menu bar 9. Code Location • Toolbar : 분기점 표시 • Subview 10. Code Reference • Window : 분기점으로 이동 • Jump 11. Disassem Code • Virtual Address 12. Cursor Disassem Code • Stack Pointer • Opcode
IDA SubView
IDA 디버깅 모드
IDA • Break Points • IDA View - EIP • Registers • Flags • Threads • IDA View - ESP • 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 • Back to User Mode • Search for • Cross References • Executable Modules
Back to User Mode • 특정 이벤트가 발생하기 전에 설정한 후, 이벤트를 발생시켜 Call 다음 위치를 잡는 기술 ex. scanf(), MessageBox() ......etc... • 사용법 :OllyDBG이용 • 이벤트 전에서 pause 를 건다. • Alt + F9 로 back to user mode 를 설정한다. • 이벤트를 발생시킨다.
Back to User Mode • OllyDBG실행 • Run (F9) • 이벤트 발생 전