리버스 엔지니어링 안녕하십니까? 리버스 엔지니어링 발표를 맡은 정창하입니다. 지금부터 리버스 엔지니어링 발표를

Slides:



Advertisements
Similar presentations
1 Prof. Young Jin Nam, Daegu University 컴퓨터 구조 (Computer Architecture) 명령어 세트 : 특성과 기능 남영진
Advertisements

YES C 제 1 장 C 언어의 개요 1/34 제 1 장 C 언어의 개요 문봉근. YES C 제 1 장 C 언어의 개요 2/34 제 1 장 C 언어의 개요 1.1 프로그램과 C 언어의 특징 1.2 C 언어의 프로그램 구성 1.3 비주얼 C++ 통합 환경 들어가기.
0 신민용, 한경수. 1 순 서  PE File 이란 ?  PE 구조를 알아야 하는 이유  개략적인 PE 구조  Section 구분이 필요한 이유  상세 구조  로더 제작 및 시연.
실행파일 (PE) 의 구조. PE(Portable Executable)  정의 : PE 구조로 된 PE 파일들은 플랫폼에 관계없이 Win32 운영 체제가 돌아가는 시스템이면 어디서든 실행 가능하다는 의미 EXE 와 DLL 등의 파일구조를 PE 파일 포맷이라고 명명함.
T A B L E 작성자 : 이 재 학.
Basic of Buffer Over Flow
Project #2-2. Pintos User Program
Shellcode 작성 김영성.
Internet Protocol Version4
제8장. RISC 및 슈퍼스칼라 프로세서 8.1 RISC의 출현 동기 8.2 RISC의 발전 경위
CRT 뽀개기 신영진.
사용자 메뉴얼 차량용 4CH 블랙박스 매뉴얼 버전 : Version 2.1 Hardware Version : 2.0
Part01. 시스템 해킹을 위한 기초 지식 Chapter01. 운영체제에 대한 이해
프로그램 제어 분기(branch)와 점프(jump) 명령어 PC의 값의 변경 순차적인 프로그램의 진행순서가
4장 어셈블리 프로그램 작성의 기본 어셈블러 어셈블리 언어 요소 예제 프로그램 데이터 정의
Chapter 02 JAVA 프로그래밍 시작하기 01 실무에서 사용하는 JAVA 개발 환경 02 JAVA 프로그램 작성
사용자 메뉴얼 차량용 4CH 블랙박스 매뉴얼 버전 : Version 1.1 Hardware Version : 1.0
Lecture #12 인터럽트 Interrupt.
[INA470] Java Programming Youn-Hee Han
Lecture #7 어셈블리어 (4) 매크로 어셈블리어 시스템프로그래밍.
System Call Linux Kernel 수업 3번째.
Install & Simulation VLSI 시스템 설계
제 1 장 마이크로프로세서의 기본동작.
Toad for SQL Server 제품 소개서 – 프로넷소프트㈜.
3장 MPU 내부구조 Slide 1 (of 28).
2 80×86 시스템에 대한 이해.
Kasimov C언어 세미나 1st.
제 3 장 로더와 링커(Loaders and Linkers)
Software Exploit and Kernel Protection
Hacker Debugging Uncovered Chapter 9:Hashing and How to Overcome it Chapter 10:Popular Protection Mechanisms Used in Demo Versions 이동현.
+ 가상 메모리 -> 물리 메모리 Selector Offset DIR Page Segmetatation
Lecture #8 어셈블리어 (5) 매크로 어셈블리어 시스템프로그래밍.
버퍼 오버플로우 시스템보안 인터넷공학전공 권영락.
9장. 중앙처리 장치의 조직과 기능 다루는 내용 컴퓨터 본체에서 CPU의 위치 살펴보기 CPU의 성능, 기능, 조직
1 마이크로프로세서의 원리 마이크로컨트롤러 AVR ATmega128.
Computer Architecture
(Un)Packing 개념 훑어보기 조 준.
어셈블리어 및 실습 금 1,2 (314) / 금 3,4 (307) RTDCS 이 종 태
6 중앙처리장치의 조직과 기능 IT CookBook, 컴퓨터 구조와 원리 2.0.
Chapter 06 명령어와 번지지정 방식.
Geek-OS Project 정영진
8086 프로세서의 구조 및 동작 방식 시스템 프로그래밍 - Lecture #2 신라대학교 컴퓨터공학과 시스템 프로그래밍.
운영체제 (Operating Systems)
BOF of 2.6 Kernel ! 박수완 / Su-Wan, PARK [ L1nkC] 숭실대학교 정보보호동아리 ACK
제3장 8086 프로세서의 내부구조.
제 2장 컴퓨터동작의 기본 개념.
Chapter 10. 파일 시스템 인터페이스(File System Interface)
파일 시스템 인터페이스(File System Interface)
임베디드 소프트웨어 설계.
10장. 중앙처리 장치의 명령어 다루는 내용 어셈블리 프로그램의 이해 인터럽트(interrupt) 명령어 세트 주소 지정 방식.
Chapter 4 The Von Neumann Model.
명품 C++ 프로그래밍 1장. C++ 시작.
Buffer Overflow
제10장 파일 시스템 인터페이스(File System Interface)
Computer System Architecture
Seoul National University
6-1 중앙 처리 장치의 내부 구조 6-2 명령(instruction) 6-3 주소 지정 방식
Windows 환경에서 동작하는 Arm Emulator(Simulator)
기억장치 관리(Memory Management)
운영체제 (Operating Systems) (Memory Management Strategies)
제 2 장 어셈블러(Assemblers) 2.1 기본 어셈블러 기능 단순 SIC 어셈블러
1. 컴퓨터 시스템 구성요소 메모리(Memory) 캐시메모리 개념 캐시메모리의 특징 적중률(hit ratio)
Copyrightⓒ ohta. All Rights Reserved.
Chapter 12 Memory Organization
파일 구조의 이해 PE Format 안녕하십니까
9장. 중앙처리 장치의 조직과 기능 다루는 내용 컴퓨터 본체에서 CPU의 위치 살펴보기 CPU의 성능, 기능, 조직
PE File Format? 20-1 김건호.
기억장치 관리(Memory Management)
10장. 컴퓨터 구조에 대한 세 번째 이야기 작성자: 윤성우.
제 1 강 컴퓨터의 구조.
Presentation transcript:

리버스 엔지니어링 안녕하십니까? 리버스 엔지니어링 발표를 맡은 정창하입니다. 지금부터 리버스 엔지니어링 발표를 시작하도록 하겠습니다. 발표자 : 정창하

Index 리버스 엔지니어링이란? 리버스 엔지니어링 사용목적 PE파일에 대해 리버스 엔지니어링 툴 리버스 엔지니어링 실습 목차는 리버스 엔지니어링이란?을 시작으로 차례대로 진행하도록 하겠습니다. 리버스 엔지니어링에 대한 대응책

리버스 엔지니어링이란? · 하드웨어 또는 소프트웨어에 대한 분해, 분석을 통해 당해 제품에 구현된 아이디어 (원리, 기술, 방법, 기능, 알고리즘, 노하우 등을 포함)를 추출해 내는 일련의 행위 · 작동하는 모든 순간의 세세한 것들까지 분석하는 것을 포함 - 기계적인 장치 - 전자적인 부품 - 소프트웨어적인 프로그램 · 역공학, 역분석 등으로 불리기도 함 리버스 엔지니어링는 리버스와 엔지니어링을 합친 말로 하드웨어 또는 소프트웨어에 대한 분해, 분석을 통해 당해 제품에 구현된 아이디어(원리, 기술, 방법, 기능, 알고리즘, 노하우 등을 포함)를 추출해 내는 일련의 행위를 뜻합니다. 주로 리버싱이라고도 말을 하며, 리버스 엔지니어링을 하는 사람을 리버스 엔지니어 혹은 리버서라고 이야기합니다.

리버스 엔지니어링이란? 간단하게 그 과정을 살펴보자면, 먼저 개발자가 소스 코드를 작성하고 자신이 택한 컴파일러로 컴파일 하여 실행 가능한 바이너리를 만드는데 이것이 우리가 흔히 쓰이고 있는 소프트웨어입니다. 이 소프트웨어를 바이너리에서 어셈블리어 코드를 추출하여 그거를 디스어셈블러 툴을 이용해서 분석을 해가면서 소스코드를 얻어내는 과정이 리버스 엔지니어링입니다.

리버스 엔지니어링 사용목적 ① DRM 등 보호 알고리즘 분석 ② 개발 효율성 증가 ③ 안정성 테스트 ④ 응용 프로그램 패치 ⑤ 악성코드 분석 ① 복제 방지 보호 해제 ② 허가되지 않는 제품 복제 리버스 엔지니어링의 핵심은 사용자가 원하는대로 프로그램이 동작하게 만드는 것 리버스 엔지니어링의 사용목적은 합법적으로 DRM 등 보호 알고리즘 분석, 개발 효율성 증가, 안정성 테스트, 응용 프로그램 패치, 악성코드 분석

리버스 엔지니어링 사용목적 · 보안 관련 리버스 엔지니어링 ① 악성코드 소프트웨어 - 악성코드 개발자 : 운영체제나 기타 소프트웨어의 취약점 분석 - 안티 바이러스 소프트웨어 개발자 : 악성코드 프로그램을 분해하고 분석 ② 암호 알고리즘 - 암호 알고리즘을 제대로 구현했는지 판단할 수 있는 유일한 방법은 제품의 소스코드를 리버싱 ③ 디지털 저작권 관리 - DRM(Digital Right Management) 기술 미디어 콘텐츠의 실행이나 처리를 보호 - 크래커들은 DRM 기술을 리버스 엔지니어링을 통해 분석 ④ 프로그램 바이너리 검사 - 소유권이 있는 소프트웨어들은 소스코드에 대한 접근이 불가하므로 보안 취약점을 찾아내기 위해 리버스 엔지니어링을 통해 검사 리버스 엔지니어링의 사용목적은 합법적으로 DRM 등 보호 알고리즘 분석, 개발 효율성 증가, 안정성 테스트, 응용 프로그램 패치, 악성코드 분석

리버스 엔지니어링 사용목적 · 소프트웨어 개발에서의 리버스 엔지니어링 ① 소프트웨어 간의 상호운용 - 상용 소프트웨어 라이브러리나 운영체제 API로 작업하는 경우 직접 리버스 엔지니어 링으로 분석 ② 경쟁 제품 분석 - 소프트웨어 전체를 리버스 엔지니어링을 하는 것은 비효율 - 특별하고 고난도의 소프트웨어 요소 개발인 경우 리버스 엔지니어링 ③ 소프트웨어의 품질과 안정성 측정 - 오픈 소스 소프트웨어는 코드를 보고 측정 - 상용 소프트웨어는 코드가 공개되지 않으므로 리버스 엔지니어링으로 통해 측정 리버스 엔지니어링의 사용목적은 합법적으로 DRM 등 보호 알고리즘 분석, 개발 효율성 증가, 안정성 테스트, 응용 프로그램 패치, 악성코드 분석

PE파일이란? · 파일에 담겨 다른 곳에 옮겨져도 실행시킬 수 있도록 규정한 형식 · 1993년 MS에서 표준안 작성 · Win32의 기본 파일 형식 · Exe, 동적 링크 라이브러리(DLL) 파일도 PE 파일 형식 · 메모리에서도 디스크에 저장된 파일 형태로 바로 실행될 수 있도록 설계

PE파일에 대해(DOS Header) · DOS Header : DOS와 호환하기 위해 사용하는 헤더(64바이트로 구성) · <Basic HEADERS tree view in hexeditor> 버튼 클릭하면 아래 그림과 같이 창 2개가 뜬다. ⓐ 창에서 선택한 항목이 ⓑ 창에서 붉은 색 박스 안에 표시 ⓐ PE파일 구조 ⓑ HEX 에디터에서 연 REVERSE_1.EXE 파일

PE파일에 대해(DOS Header) · Magic number : DOS Header의 시그네처로 4D 5A(MZ) 값을 가짐 ※ MZ는 DOS 설계자인 마크 즈비코프스키(Mark Zbikowski)에서 이름을 따온 것이며, 도스 헤더의 시작을 알리는 코드 · File address of new exe header : PE 헤더의 시작점을 가리키는 오프셋 값 · DOS 헤더 항목을 확장한 ‘Magic Number’ 부분은 HEX 에디터의 오른쪽 블룩에서 ‘MZ’ 문자열 확인 · DOS 헤더에서 중요한 부분은 마지막 ‘File address of new exe header’ e_lfanew 값 이라고도 하는데, 여기에는 PE 헤더의 주소 값이 적혀있다.

PE파일에 대해(DOS Header) ※ 위 그림에서 e_lfanew 필드의 값은 000000D8입니다. 주의할 점은 값이 D8000000 이 아닌 이유는 윈도우는 리틀 엔디안 시스템이므로 상위주소부터 읽어야 함

PE파일에 대해(DOS Header) · 리틀 엔디안(Little Endian) 표기법 - Intel 계열 CPU에서 사용하는 표기법 - 낮은 주소부터 시작하여 하위 바이트를 기록 - 반대로 낮은 주소부터 시작하여 상위 바이트를 기록하는 방법은 빅 엔디언(Big Endian) 표기법이라고 한다.

PE파일에 대해(DOS Stub Code) · Stub Code : ‘This program cannot be run in DOS mode’와 같이 적절하지 못한 상황에서PE 파일이 실행될 때 경고문 등에 대한 데이터 포함

PE파일에 대해(PE 헤더) · PE 헤더 : PE 파일의 구성 정보 보유, 데이터 특성별로 섹션으로 구분하여 저장 엔트리 포인트, 메모리상의 각 섹션이 차지하는 크기, 디스크상에서의 섹션 정렬, PE파일의 총 길이 등

PE파일에 대해(PE 헤더) · PE 헤더 필드 - Machine(0x014C, 2바이트) : CPU ID. IA32(Intel Architecture 32)의 경우 0x014C, IA64일 경우 0x0200 - NumberOfSections(0x0005, 2바이트) : 파일에 존재하는 섹션의 개수. - TimeDateStamp(0x4CAD899A, 4바이트) : 파일이 생성된 시간과 날짜 - PointerToSymbolTable(0x00000000, 4바이트) : 디버깅을 위해 사용 - NumberOfSymbol(0x00000000, 4바이트) : 디버깅을 위해 사용 - SizeOfOptionalHeader(0x000E, 2바이트) : PE 파일 헤더 뒤에 오는 옵션 헤더 (optionalheader) 크기를 16으로 나눈 값 - Characteristics(0x010E, 2바이트) : 파일의 속성. 일반 실행 파일의 경우 값 0x010F, 이 속성을 통해 파일이 exe인지 dll인지 구분

PE파일에 대해(섹션 헤더) · 섹션 헤더 : Optional 헤더라고도 불리며, PE 파일에서 프로그램과 관련한 필수 정보를 담고 있는 부분(30개의 필드와 데이터 디렉터리 1개를 가짐)

PE파일에 대해(섹션 헤더) · 섹션 헤더 필드 - Magic(0x010B, 2바이트) : 시작 위치의 필드, Optional 헤더 구분 시그니처(값 0x010B) - AddressOfEntryPoint(0x00001120, 4바이트) : PE 파일이 메모리에 로드된 후 처음 실행되는 코드의 주소, 가상 주소의 절대 값이 아닌 이미지 베이스부터의 오프셋 값인 상대 가상 주소(RVA, Relative Virtual Address)다. 엔트리 포인트는 .text 섹션(실행 코드를 담고 있는 메모리 영역)의 시작점인 경우가 대부분. 이 값은 .text 섹션 헤더의 가상 주소 값과 일치하는 경우가 많다. - ImageBase(0x00400000, 4바이트) : PE 파일이 로더에 의해서 메모리에 로드되는 위치 - SectionAlignment(0x00001000, 4바이트) : 각 섹션이 메모리에서 차지하는 최소 단위 - FileAlignment(0x00001000, 4바이트) : 디스크의 섹션 정렬과 관련 있는 필드 - SizeOfImage(0x00020070, 4바이트) : 메모리에 로드된 PE 파일의 총 크기로 Section Alignment의 배수가 되어야 한다. - SizeOfHeader(0x00001000, 4바이트) : 디스크에서 헤더의 총 크기로 File Alignment의 배수가 되어야 한다.

PE파일에 대해(섹션 헤더) · Data Directory · 다른 DLL에서 함수를 가져오거나 본 파일의 함수를 내보낼 때 해당 정보 기록 · Export Table(16바이트) : Export 함수들에 대한 테이블의 시작 위치와 크기 · Import Table(16바이트) : Import 함수들에 대한 테이블의 시작위치와 크기 · DLL은 함수 Export, EXE는 해당 DDL로부터 함수 Import · PE 파일의 섹션 테이블에는 .idata라는 이름으로 지정

PE파일에 대해(섹션 테이블) · 메모리 보호를 위한 최소 단위가 페이지이므로, 페이지 단위로 속성 설정 · 속성에 위배되는 행동 시 접근 오류가 발생하여 메모리 보호 · 페이지 단위 메모리 속성 설정 - 성질이 다른 데이터들은 하나의 페이지에 설정 불가 - 실행 코드, 읽고 쓰기가 가능한 데이터, 읽기만 가능한 데이터는 별도 페이지 설정

PE파일에 대해(섹션 테이블) · PE파일에 존재하는 섹션 - .text : 실행되는 코드를 담고 있는 섹션 - .data : 초기화된 전역변수를 담고 있으며, 읽고 쓰기가 가능한 섹션 - .rdata : 읽기 전용의 데이터 섹션 - .bss : 초기화되지 않은 전역변수를 위한 섹션 - .idata : 다른 DDL에서 가져다 쓰는 함수들의 정보를 담고 있는 섹션 - .edata : 다른 모듈이 PE파일에 정의된 함수를 사용할 수 있도록 함수 목록을 담고 있는 섹션 - .rsrc : 초기화, 읽기 속성을 지니며 리소스가 저장되는 섹션

PE파일에 대해(섹션 테이블) · .text 섹션 - Name(.text, 8바이트) : 섹션 이름 - VirtualSize(0x0001E100, 8바이트) : 섹션 크기 - Virtual Offset(0x00001000, 8바이트) : 섹션이 로드 될 가상주소 PE 형식 내에서 이 필드도 상대 가상 주소(RVA)임 - SizeofRawData(0x000100F0, 8바이트) : File Alignment의 다음 배수 값까지 반올림 한 섹션 데이터의 크기 - PointerToRawData(0x00001000, 8바이트) : 섹션의 시작을 담고 있는 파일 오프셋 PE로더는 파일 안의 섹션에서 데이터 위치를 알기 위해 이 영역의 값 이용 - Characteristics(0x60000020, 8바이트) : 섹션의 실행 코드, 초기화된 데이터, 비초기화된 데이터와 같은 Flag(플래그)를 가지고 있음 메모리에 대한 실행(eXecute), 읽기(Read), 쓰기(Write) 속성 지정 · 로더 : PointerToRawData가 지정한 곳부터 데이터를 SizeOfRawData만큼 읽음 Virtual Offset에 맵핑한 후 Characteristics에 설정된 속성 정보를 이용 페이지별 메모리 보호 적용

리버스 엔지니어링 툴 · 올리디버거(Ollydbg) - 리버싱을 하기 위해서 디스어셈블리 툴과 디버그 툴이 필요한데 올리디버거는 디스어셈블리와 디버그 두 가지 모두 가능한 툴 - API 함수들을 잘 분석해주고, 많은 플러그인이 있어 많은 지원을 함 - 주소 : www.ollydbg.de/

리버스 엔지니어링 툴 ➊ 메모리 주소 : 프로그램을 메모리에 로드 시 메모리상에 로드된 프로그램의 명령어 [ 올리디버거 실행 화면 ] ➊ 메모리 주소 : 프로그램을 메모리에 로드 시 메모리상에 로드된 프로그램의 명령어 코드 및 데이터의 가상 주소와 라벨 표시 ➋ 기계어 코드와 어셈블리어 코드 : 프로그램의 기계어 코드와 어셈블리어 코드 출력 ➌ 주석 창 : 올리 디버거가 분석한 API 함수, 문자열, 함수 인자 확인 사용자가 주석 입력 ➍ 레지스터와 플래그 창 : 주요 레지스터와 플래그의 상태 값 확인 ➎ 변수 값 출력 창 : 디버깅 중에 주요 변수 값 확인 ➏ HEX 덤프 창 : 프로그램을 HEX 값으로 덤프하여 보여주며, 바이너리 파일을 직접 수정 ➐ 스택 : 스택의 현재 상태 등 확인

리버스 엔지니어링 툴 · 레지스터 종류와 기능 범주 80386 레지스터 이름 비트 용도 범용 레지스터 (General Register) EAX 누산기 (Accmulator) 32 주로 산술 연산에 사용(함수의 결과 값 저장) EBX 베이스 레지스터 (Base Register) 특정 주소 저장(주소 지정을 확대하기 위한 인덱스 로 사용) ECX 카운트 레지스터 (Count Register) 반복적으로 실행되는 특정 명령에 사용(루프의 반복 횟수나 좌우 방향 시프트 비트 수 기억) EDX 데이터 레지스터 (Data Register) 일반 자료 저장(입출력 동작에 사용) 세그먼트 레지스터 (Segment Register) CS 코드 세그먼트 레지스터 (Code Segment Register) 16 실행될 기계 명령어가 저장된 메모리 주소 지정 DS 데이터 세그먼트 레지스터 (Data Segment Register) 프로그램에서 정의된 데이터, 상수, 작업 영역의 메 모리 주소 지정 SS 스택 세그먼트 레지스터 (Stack Segment Register) 프로그램이 임시로 저장해야 하는 데이터나 사용자 의 피호출 서브 루틴(called subroutine)이 사용할 데이터와 주소 저장 ES, FS, GS 엑스트라 세그먼트 레지스터 (Extra Segment Register) 문자 연산과 추가 메모리 지정을 위해 사용되는 여 분의 레지스터

리버스 엔지니어링 툴 · 레지스터 종류와 기능 범주 80386 레지스터 이름 비트 용도 포인터 레지스터 (Pointer Register) EBP 베이스 포인터 (Base Pointer) 32 SS 레지스터와 함께 사용되어 스택 내의 변수 값을 읽는 데 사용 ESP 스택 포인터 (Stack Pointer) SS 레지스터와 함께 사용되며 스택의 가장 끝 주소를 가 리킴 EIP 명령 포인터 (Instruction Pointer) 다음 명령어의 오프셋(Offset, 상대 위치 주소)을 저장하 며 CS 레지스터와 합쳐져 다음에 수행될 명령의 주소 형 성 인덱스 레지스터 (Index Register) EDI 목적지 인덱스 (Destination Index) 목적지 주소에 대한 값 저장 ESI 출발지 인덱스 (Source Index) 출발지 주소에 대한 값 저장 플래그 레지스터 EFLAGS 플래그 레지스터 (Flag Register) 연산 결과 및 시스템 상태와 관련된 여러 가지 플래그 값 저장

리버스 엔지니어링 툴 · 올리디버거 단축키와 기능 키 기능 설명 F2 Toggle 브레이크 포인트를 지정 F9 Run 브레이크 포인트까지 실행 Ctrl+F2 Restart 코드 처음 부분으로 회귀 F7 Step into Call함수나 반복적으로 수행하는 Rep 명령을 만났을 때 함수 내부로 추적 또는 Rep 조건을 만족할 때까지 계속 수행 F8 Step over 함수 내부로 추적하지 않고 함수 실행 후 그 다음 코드로 넘어감 Rep 같은 반복 명령도 한번에 처리하고 다음 코드로 실행 Ctrl+F9 Execute till return API 함수나 추적해 들어갈 필요 없는 함수 내부로 추적해 들어갔을 때 해당 함수의 ret 명령 지점까지 한번에 실행하고 함수를 나온다. Alt+K Call Stack 현재 호출된 함수 목록을 보여줌

리버스 엔지니어링 툴 · IDA - 디스어셈블러로 올리 디버거와 마찬가지로 리버스 엔지니어링에 매우 많이 사용

리버스 엔지니어링 툴 · Process Monitor - 레지스터 모니터, 파일 모니터, 네트워크 모니터, 프로세스 및 스레드 모니터가 있다.

리버스 엔지니어링 실습 · 올리디버거(Ollydbg) 초기 설정 - 압축 파일을 풀고 올리디버거 폴더에 UDD폴더와 Plugin 폴더 생성

리버스 엔지니어링 실습 실행 후 Options -> Appearance로 들어간다. Directories 탭 -> UDD path와 Plugin path를 아까 만들었던 폴 더로 각각 바꿔준다.

리버스 엔지니어링 실습 올리디버거를 종료 후, 올리디버거 폴더 에 있는 3개의 dll 파일을 plugin 폴더로 옮겨준다. - BOOKMARK.DLL, Cmdline.dll, dbghelp.dll UDD 폴더에는 백업 파일이 들어간다.(따로 만드는 이유는 많은 작업을 하다 보면 백업파일 때문에 지저분해지기 때문에 관리하는 차원에서 만듬) Plugin 폴더에는 플러그인이 들어간다.

리버스 엔지니어링 실습 [Options]-[Debugging options] 메뉴 선택 [Event] 탭에서 ‘Entry point of main module’로 선택 올리디버거 폴더의 ollydbg.ini를 메모장으로 열어 밑의 그림과 같이 설정

리버스 엔지니어링 실습 1. 바이너리 파일 수정을 통해 리버스 엔지니어링 공격하기 Reverse_2.exe 실행 결과 ① 실습용 테스트 파일 생성 - 실행시 다음과 같이 패스워드를 입력 - abcd 입력 시 틀리면 ‘∼ !! is a Wrong Password!’ 맞으면 ‘abcd !! is the Correct Password!’출력 Reverse_2.exe 실행 결과

리버스 엔지니어링 실습 문자열 입력받음 입력받은 문자열:A A와 “abcd”를 비교 맞는 패스워드라고 출력하기 Reverse_2.exe 실행 결과 리버스 엔지니어링 실습 문자열 입력받음 입력받은 문자열:A A와 “abcd”를 비교 맞는 패스워드라고 출력하기 같다 틀린 패스워드라고 출력하기 함수 종료 다르다 다르다

리버스 엔지니어링 실습 1. 바이너리 파일 수정을 통해 리버스 엔지니어링 공격하기 Reverse_2.exe 실행 결과 ② 파일 열기 - [File]-[Open]에서 Reverse_2.exe 파일 열기

리버스 엔지니어링 실습 1. 바이너리 파일 수정을 통해 리버스 엔지니어링 공격하기 Reverse_2.exe 실행 결과 ③ 리버스 엔지니어링 포인트 찾기 - 잘못된 패스워드 입력시, ‘∼ !! is a Wrong Password!’메시지 출력 - 이 메시지 출력 지점을 시작점으로 검증 로직을 찾기 - 올리 디버거 어셈블리어 영역에서 마우스 오른쪽 버튼 클릭 - [Search for]-[All referenced text strings] 메뉴 실행

리버스 엔지니어링 실습 1. 바이너리 파일 수정을 통해 리버스 엔지니어링 공격하기 Reverse_2.exe 실행 결과 ③ 리버스 엔지니어링 포인트 찾기 - 잘못된 패스워드 입력시, ‘∼ !! is a Wrong Password!’메시지 출력 - 이 메시지 출력 지점을 시작점으로 검증 로직을 찾기 - 올리 디버거 어셈블리어 영역에서 마우스 오른쪽 버튼 클릭 - [Search for]-[All referenced text strings] 메뉴 실행

리버스 엔지니어링 실습 1. 바이너리 파일 수정을 통해 리버스 엔지니어링 공격하기 Reverse_2.exe 실행 결과 ③ 리버스 엔지니어링 포인트 찾기 - 해당 문자열에서 마우스 오른쪽 버튼 클릭 [Follow in Disassembler] 메뉴 선택 - 어셈블리어 코드 확인

리버스 엔지니어링 실습 ④ 프로그램 변경 포인트 찾기 Reverse_2.exe 실행 결과 순번 주소 어셈블리어 코드와 주석 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 0040106B 00401070 00401073 00401075 00401077 0040107A 0040107B 00401080 00401085 00401088 0040108A 0040108D 0040108E 00401093 00401098 0040109B 0040109D 0040109E CALL REVERSE_.strcmp ; \strcmp ADD ESP,8 TEST EAX,EAX JNZ SHORT REVERSE_.0040108A LEA EAX,DWORD PTR SS:[EBP-C] PUSH EAX ; /<%s> PUSH OFFSET REVERSE_.??_C@_0CA@DGOJ@?$CF> ; |format = “%s !! is the Correct Password!” CALL REVERSE_.printf ; \printf JMP SHORT REVERSE_.0040109B LEA ECX,DWORD PTR SS:[EBP-C] PUSH ECX ; /<%s> PUSH OFFSET REVERSE_.??_C@_0BM@KOLE@?$CF> ; |format = “%s !! is a Wrong Password!” CALL REVERSE_.printf ; \printf XOR EAX,EAX POP EDI POP ESI 주소값 조작 1번줄 strcmp 스트링 호출 2번줄 ESP 값에 8을 더함 3번줄 4번줄 결과가 0일 때 0040108A로 점프, 1일 때 무시 5번줄 EBP-C 값을 EAX에 저장 6번줄 스택에 EAX 값을 저장 8번줄 printf문 호출 9번줄 ESP 값에 8을 더함 10번줄 아무조건없이 0040109B로 점프 11번줄 EBP-C 값을 EAX에 저장 12번줄 스택에 EAX 값을 저장 14번줄 printf문 호출 15번줄 ESP 값에 8을 더함 16번줄 EAX 를 0으로 초기화 17번줄 리턴되기 전에 저장해 놓았던 원래 EDI 값으로 복원 18번줄 리턴되기 전에 저장해 놓았던 원래 ESI 값으로 복원

리버스 엔지니어링 실습 1. 바이너리 파일 수정을 통해 리버스 엔지니어링 공격하기 Reverse_2.exe 실행 결과 - (1)번의‘CALL REVERSE_.strcmp’부터 (3)번까지 : 어떤 값을 비교 - (4)번, (10)번 : 점프문 - (4)번 점프 주소 : 0040108A, 이 값은 (11)번 주소 값 - (10)번 점프 주소 : 0040109B, 이 값은 (16)번 주소 값 - 문자열을 비교(어셈블리어코드(1)∼(3)) - ZF값 0이 아니면 0040108A 주소로 점프 - 0040108A 주소에‘%s !! is a Wrong Password!’ 출력 구문(어셈블리어 코드 (11)∼(14)) - ZF 값이 0 이면 맞는 패스워드 출력 (어셈블리어 코드 (5)∼(8)) 0040109B로 점프 함수종료)

리버스 엔지니어링 실습 1. 바이너리 파일 수정을 통해 리버스 엔지니어링 공격하기 Reverse_2.exe 실행 결과 ⑤ 프로그램 변경하기 - 변경할 라인에서 마우스 오른쪽 버튼 클릭 [Assemble] 메뉴 선택 - JNZ 목적 주소지 00401077로 바꾼 뒤 <Assemble> 버튼 클릭 팝업창 닫기

리버스 엔지니어링 실습 1. 바이너리 파일 수정을 통해 리버스 엔지니어링 공격하기 Reverse_2.exe 실행 결과 ⑤ 프로그램 변경하기 - 해당 라인에서 마우스 오른쪽 버튼 클릭 [Copy to executable]-[Selection] 메뉴 선택 - 마우스 오른쪽 버튼 클릭 [Save File] 메뉴로 파일을 다른 이름으로 저장

리버스 엔지니어링 실습 1. 바이너리 파일 수정을 통해 리버스 엔지니어링 공격하기 Reverse_2.exe 실행 결과 ⑤ 프로그램 변경하기

리버스 엔지니어링 실습 1. 바이너리 파일 수정을 통해 리버스 엔지니어링 공격하기 Reverse_2.exe 실행 결과 ⑥ 결과 확인하기 : 저장한 파일 실행

리버스 엔지니어링에 대한 대응책 · 패킹 Reverse_2.exe 실행 결과 - 원본 프로그램을 새로운 PE파일에 패킹된 형태로 압축, 암호화하여 저장하는 기술 ※ 패킹된 프로그램은 프로그램이 정상적으로 실행될 수 있도록 복호화하고 압축을 풀어내는 logic을 포함하고 있음.

Reverse_2.exe 실행 결과 리버스 엔지니어링에 대한 대응책 · 패킹

리버스 엔지니어링에 대한 대응책 · 안티 리버싱(Anti-Reversing) · 타이밍 체크 · 쓰레기 코드 넣기와 치환 Reverse_2.exe 실행 결과 리버스 엔지니어링에 대한 대응책 · 안티 리버싱(Anti-Reversing) - 리버스 엔지니어링을 어렵게 만드는 기술 - 수행되는 디버거의 활동을 탐지하여 프로그램을 강제로 종료 · 타이밍 체크 - 프로세스가 디버깅 중 CPU 연산 시간이 정상적으로 실행되었을 때보다 많이 걸린다는 점에서 착안 - RDTSC(Read Time-Stamp Counter)명령 : 두 구간 사이의 Time Stamp 값 비교 - 시간이 많이 걸리는 특정구간을 디버깅 중으로 판단, 프로그램이나 디버거 종료 · 쓰레기 코드 넣기와 치환 - 코드 사이에 의미가 없는 쓰레기(Garbage Code)코드를 넣고 다단계의 점프 문을 섞어 코드를 치환하여 배치

리버스 엔지니어링에 대한 대응책 · 실습) UPX 패킹하기 가장 일반적으로 쓰이는 패킹기술, 주목적은 코드의 암호화가 아닌 압축로직 확인 ① upx307w를 압축 푼 후 폴더를 C로 이동 ② 실습자료 REVERSE_1.exe파일을 upx307w 폴더로 복사 후 붙여넣기

리버스 엔지니어링에 대한 대응책 ③ cmd를 실행하여 다음 그림과 같이 실행 옆의 화면은 UPX를 통한 패킹 수행을 위해 옵션 확인

리버스 엔지니어링에 대한 대응책 ④ 밑에 있는 코드를 적어 결과 확인 upx -v REVERSE_1.exe

리버스 엔지니어링에 대한 대응책 ⑤ UPX를 이용한 패킹한 REVERSE_1.exe 파일을 올리디버거로 다시 열어본다 ※ 확인을 하게 되면 어셈블리어 코드 내용을 전혀 확인할 수 없을 것이다

리버스 엔지니어링에 대한 대응책 ⑥ Exeinfo PE를 실행하여 언패킹하기 전에 어떤 패커로 패킹되었는지 확인 ※ 원래는 확인 가능하던 어셈블리어 코드 내용을 전혀 확인 할 수 없다 [ Exeinfo PE를 이용해 UPX로 패킹된 파일 확인 ]

리버스 엔지니어링에 대한 대응책 ⑦ 밑에 있는 코드를 적어 결과 확인 upx -d REVERSE_1.exe [ UPX를 이용한 REVERSE_1.exe 언패킹]