0 신민용, 한경수. 1 순 서  PE File 이란 ?  PE 구조를 알아야 하는 이유  개략적인 PE 구조  Section 구분이 필요한 이유  상세 구조  로더 제작 및 시연.

Slides:



Advertisements
Similar presentations
1 파일 및 폴더 다루기 A. 파일이란 : 응용프로그램을 이용해서 만든 사용자가 만든 정보의 집합 - 파일 형식 : 이름과 확장자로 이뤄짐 예 sample.txt 샘플.txt - 복원하려면 휴지통에서 파일선택 후 드래그해서 밖으로 이동 혹은 RESTORE B. 확장자의.
Advertisements

1 구조체 윤 홍 란 컴퓨터 프로그래밍 2 구조체 정의  구조체란 ? o 서로 다른 형의 변수들을 하나로 묶어주는 mechanism. (cf. 배열 : 같은 형의 변수들을 하나로 묶어주는 mechanism) o 예 : 카드의.
실행파일 (PE) 의 구조. PE(Portable Executable)  정의 : PE 구조로 된 PE 파일들은 플랫폼에 관계없이 Win32 운영 체제가 돌아가는 시스템이면 어디서든 실행 가능하다는 의미 EXE 와 DLL 등의 파일구조를 PE 파일 포맷이라고 명명함.
출석수업 과제 – 총 5문제, 10월 25일 제출 정보통계학과 장영재 교수.
Format String Attack! 포맷 스트링 공격 경일대학교 사이버보안학과 학년 남주호.
컴퓨터와 인터넷.
Chapter 16 : Struts 프레임워크 2. chapter 16 : Struts 프레임워크 2.
ㅎㅎ 구조체 구조체 사용하기 함수 매개변수로서의 구조체 구조체 포인터와 레퍼런스 구조체 배열.
ㅎㅎ 구조체 C++ 프로그래밍 기초 : 객체지향의 시작 구조체 사용하기 함수 매개변수로서의 구조체 구조체 포인터와 레퍼런스
Image & Video processing
제 9 장 구조체와 공용체.
MySQL 및 Workbench 설치 데이터 베이스.
제15장 파일 입출력 문자열을 출력하는 여러가지 방법 (15-2쪽) 문자열만 처리하는 입출력 함수
4장. 웹로직 서버상에서의 JDBC와 JTA의 운용
UNIT 07 Memory Map 로봇 SW 교육원 조용수.
CHAPTER 02 OpenCV 개요 PART 01 영상 처리 개요 및 OpenCV 소개.
Visual Basic .NET 처음 사용하기.
Communication and Information Systems Lab. 황재철
리버스 엔지니어링 안녕하십니까? 리버스 엔지니어링 발표를 맡은 정창하입니다. 지금부터 리버스 엔지니어링 발표를
11장. 포인터 01_ 포인터의 기본 02_ 포인터와 Const.
8장 함수 함수의 필요성 라이브러리 함수와 사용자 정의 함수 함수의 정의, 원형, 호출 배열을 함수 인자로 전달 재귀호출.
SqlParameter 클래스 선문 비트 18기 발표자 : 박성한.
                              데이터베이스 프로그래밍 (소프트웨어 개발 트랙)                               퍼스널 오라클 9i 인스톨.
임베디드 실습 # LED, 7’Segment 제어
WinCE Device Driver 실습 #2
11장. 1차원 배열.
WOL(Wake-On Lan) 컴퓨터공학과 4학년 박기웅.
C 프로그래밍 C언어 (CSE2035) (Chap11. Derived types-enumerated, structure, and union) (1-1) Sungwook Kim Sogang University Seoul, Korea Tel:
JA A V W. 03.
사용자 함수 사용하기 함수 함수 정의 프로그램에서 특정한 기능을 수행하도록 만든 하나의 단위 작업
박성진 컴퓨터 프로그래밍 기초 [09] 배열 part 1 박성진
UNIT 07 Memory Map 로봇 SW 교육원 조용수.
7가지 방법 PowerPoint에서 공동 작업하는 다른 사용자와 함께 편집 작업 중인 사용자 보기
HTTP 프로토콜의 요청과 응답 동작을 이해한다. 서블릿 및 JSP 를 알아보고 역할을 이해한다.
24장. 파일 입출력.
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
에어 조건문.
컴퓨터 프로그래밍 기초 - 10th : 포인터 및 구조체 -
2장. 변수와 타입.
컴퓨터 시스템 하드웨어 컴퓨터 시스템 소프트웨어 C P U Control Unit 입 력 장 치 출 력 장 치 ALU
컴퓨터 프로그래밍 기초 - 8th : 함수와 변수 / 배열 -
파일 구조의 이해 PE Format 안녕하십니까
5강. 배열 배열이란? 배열의 문법 변수와 같이 이해하는 배열의 메모리 구조의 이해 레퍼런스의 이해 다차원 배열
9강. 클래스 실전 학사 관리 프로그램 만들기 프로그래밍이란 결국 데이터를 효율적으로 관리하기 위한 공구
컴퓨터 프로그래밍 기초 [01] Visual Studio 설치 및 사용방법
14강. 세션 세션이란? 세션 문법 Lecturer Kim Myoung-Ho Nickname 블스
Canary value 스택 가드(Stack Guard).
^^ Computer Programming 2 dmpr.cnu.ac.kr/~daygax.
데이터 동적 할당 Collection class.
PHP 웹 프로그래밍 (PHP Web Programming) 미리 정의된 함수 문양세 강원대학교 IT대학 컴퓨터과학전공.
PE File Format? 20-1 김건호.
에어 PHP 입문.
수동 설치시는 설치 방법 1. 두번에 설치 CD 속에 fscommand 폴더 밑에 Osstem 이라는 폴더를
STS 또는 Eclipse 에서 프로젝트를 Export 하고 Import 하는 방법
05. General Linear List – Homework
7주차: Functions and Arrays
함수, 모듈.
TVM ver 최종보고서
구조체(struct)와 공용체(union)
Summary of Pointers and Arrays
슬라이드 쇼의 설정 슬라이드 쇼의 실행 파일과 폴더의 관리 글꼴을 포함해서 저장 웹 페이지로 게시 압축 파일
Numerical Analysis Programming using NRs
Chapter 12 파일 입출력.
Chapter 11 구조체.
바이트 순서 변환 함수 주소 변환 함수 바이트 조작 함수 원격지 호스트 정보를 얻는 함수
CCIT 네트워크 발표 정보보호학과 평문 사이트와 SSL 사이트, SSL strip과 데이터 변조를 이용한 로그인 취약점
Reversing 발표자 : 박현우.
개정판 누구나 즐기는 C언어 콘서트 제13장 동적 메모리 출처: pixabay.
CODE INJECTION 시스템B 김한슬.
6 객체.
Presentation transcript:

0 신민용, 한경수

1 순 서  PE File 이란 ?  PE 구조를 알아야 하는 이유  개략적인 PE 구조  Section 구분이 필요한 이유  상세 구조  로더 제작 및 시연

 정 의 ◦ MS WINDOWS 3.1 부터 지원되는 실행 파일의 형식을 말한다. 유닉스 COFF (Common Object file format) 를 기반으로 나왔으며, PE 포맷을 사용하는 파일의 확장자는 cpl, exe, dll, ocx, vxd, sys, scr, drv 가 있다.  다양한 운영 체제에 이식이 가능한 실행 형식 (Portable Excutable) 이라는 이름 2

 프로그램 실행 원리 - 폰노이만 구조 ◦ 데이터 메모리와 프로그램 메모리가 구분되어 있지 않고 하나의 버스를 가지고 있는 구조 ◦ CPU, 메모리, 프로그램 구조를 갖는 프로그램 내장 방식 컴퓨터의 아이디어 3

 디스크에서 본 실행파일 (notepad.exe) 4

 메모리에서 본 실행파일 (notepad.exe) 5

 CPU 에서 본 실행파일 (notepad.exe) 6

 4C01 이란 ? ◦ 우선 Big Endian 과 Little Endian 을 비교해 보자 7 인텔기반 4C01 014C

 4C01 이란 ? 8

 의미 전달을 위해서 9 Notepad.exeVisual Studio2010 어디가 시작일까 ?

 의미 전달을 위해서 ◦ 의미단위 프레임이 필요 ⇒ Protocol ◦ IP (Internet Protocol), TCP (Transmission Control Protocol) 10 IP Header UDP Header TCP Header

 의미 전달을 위해서 ◦ 실행 가능한 프로그램 ⇒ PE 구조 11 Memory

 실행프로그램의 수행 기능을 추가 / 변경  이번 프로젝트에서의 Packing 의 경우 ◦ 프로그램 자체 기능에 영향을 미치지 않아야 한다. ◦ Reversing 을 어렵게 만들어야 한다. 12 File 자체를 분석하지는 못하도록 실행파일을 변환시킨다. 실행 시에는 제대로 수행할 수 있도록 다시 변환시켜야 한다. File 자체를 분석하지는 못하도록 실행파일을 변환시킨다. 실행 시에는 제대로 수행할 수 있도록 다시 변환시켜야 한다.

 이번 프로젝트에서의 Packing 의 경우 ◦.text,.data 에 있는 값들을 변환시킨다. 13 Section(“.pack”) Section header(“.pack”)

E0 1D8

E0 1D8 DOS 실행파일 설계자 Mark Zbikowski 의 이니셜 새로운 EXE Header 의 주소 : 0x000000E0

16 DOS 에서 실행 시 수행되는 부분 E0 1D8 16 비트 assembly 어 0D : Carrige Return(CR) 0A : Line Feed(LF) 0D : Carrige Return(CR) 0A : Line Feed(LF)

E0 1D8 PE 구조의 서명은 ‘PE’ Machine : 4C01 Section 의 수 : 0x0003 TimeStamp : 0x41107CC3 SizeOfOptionalHeader : 0x00E0 Characteristics : 0x010F Characteristics : 0x010F

E0 1D8 Magic : 0x010B(32bit) 0x020B(64bit) Magic : 0x010B(32bit) 0x020B(64bit) SizeOfCode : 0x AddressOfEntryPoint : 0x D ImageBase : 0x SectionAlignment: 0x FileAlignment: 0x SizeOfImage : 0x SizeOfHeaders : 0x Subsystem : 0x0002(GUI) 0x0001(sys, driver file) 0x0003(CUI) Subsystem : 0x0002(GUI) 0x0001(sys, driver file) 0x0003(CUI) NumberOfRvaAndSizes : 0x

E0 1D8 Name : “.text” VirtualSize: 0x x VirtualAddress: 0x SizeOfRawData: 0x x x x PointerToRawData: 0x Characteristics: 0x x

E0 1D8 0x x x x x 구 분구 분주 소주 소 파일에서 시작주소 0x 파일에서 섹션크기 0x 메모리에서 시작주소 (RVA)0x 메모리에서 섹션크기 0x ImageBase0x x00007B48 0x00007BFF 0x00007C00 0x00007B48

PE format IMAGE_DOS_HEADER MS-DOS Stub Program IMAGE_NT_HEADERS IMAGE_SECTION_HEADER.text IMAGE_SECTION_HEADER.dat a IMAGE_SECTION_HEADER.rsr c Section body (.text) Section body (.data) Section body (.rsrsc) IMAGE_NT_HEADERS DWORD Signature; IMAGE_FILE_HEADER IMAGE_OPTIONAL_HEADER32

왜 PE 파일은 여러 개의 섹션을 두었는가 ? 안전성 Code : 실행, 읽기 권한 Data : 읽기, 쓰기 권한 Resource : 읽기 권한

IMAGE_SECTION_HEADER BYTE Name[IMAGE_SIZEOF_SHORT_NAME]; union { DWORD PhysicalAddress; DWORD VirtualSize; } Misc; DWORD VirtualAddress; DWORD SizeOfRawData; DWORD PointerToRawData; DWORD PointerToRelocations; DWORD PointerToLinenumbers; WORD NumberOfRelocations; WORD NumberOfLinenumbers; DWORD Characteristics;

RVA to FileOffset – 1 우리가 다룰 주소의 종류는 크게 네가지로 나눌 수 있다. –Physics Address –VA : Virtual Address –RVA : Relative Virtual Address –RawOffset ≡ FileOffset 지금까지 다루어지던 주소들은 모두 RVA 로써 RVA 를 FileOffset 으로 변환을 하려면 조금의 연산이 필요하다.

RVA to FileOffset – 2 RVA – BaseVirtualAddress + PointerToRawData = FileOffset Ex1 ) RVA = 0x4880 의 FileOffset 은 ? FileOffset = 0x4880 – 0x x400 = 0x3C00 Ex2 ) RVA = 0x9550 의 FileOffset 은 ? FileOffset = 0x9550 – 0x x7C00 = 0x8150 0x1000 <= 0x4880 < 0x x7748 0x9000 <= 0x9550 < 0x x1BA8

Import Address Table - 0 Export Address Table Import Address Table

Import Address Table - 1 IAT – 어떤 프로그램에서 어떤 라이브러리 를 사용하는지 기술한 테이블. Programs A.EXE B.EXE C.EXE D.EXE Dll files comdlg32.dll SHELL32.dll COMCTL32.dll msvcrt.dll ADVAPI32.dll

Import Address Table - 2 Call 7C8107F0 과 똑같은 효과. 하지만 왜 call [ ] 로 쓸까 ? 파일이 실행되는 순간 PE Loader 가 의 위치에 CreateFileW 의 주소를 입력

Import Address Table - 3 typedef struct _IMAGE_IMPORT_DESCRIPTOR { union { DWORD Characteristics DWORD OriginalFirstThunk; //IMAGE_IMPORT_BY_NAME array } DUMMYUNIONNAME; DWORD TimeDateStamp; DWORD ForwarderChain; DWORD Name; // dll 이름 DWORD FirstThunk; //dll 안에 있는 함수주소들이 하드코딩되어있다. } IMAGE_IMPORT_DESCRIPTOR

Import Address Table – 4 RVA to Offset 변환 cmddlg32.dll 의 Original First Thunk

Export Address Table – 0 Kernel32.dll 을 KPloader 로 열어본 모습 Export Address Table

Export Address Table – 1 EAT(Export Address Table) 은 라이브러리 파일에서 제공하는 함수를 다른 프로그램에서 가져다 사용할 수 있도록 해주는 매커니즘. Kernel32.dll 의 RVA : 0x262C 를 offset 으로 변환해보면 0x262C – 0x x400 = 0x1A2C 가 됩니다.

Export Address Table - 2 typedef struct _IMAGE_EXPORT_DIRECTORY { DWORD Characteristics; DWORD TimeDateStamp; WORD MajorVersion; WORD MinorVersion; DWORD Name; // dll 이름을 가르키는 주소 DWORD Base; DWORD NumberOfFunctions; // 실제 함수의 개수 ( 전체 ) DWORD NumberOfNames; // 이름을 가지는 함수의 개수 DWORD AddressOfFunctions; // 함수의 주소배열을 가르키는 주소 DWORD AddressOfNames; // address of functino name string array DWORD AddressOfNameOrdinals; // address of ordinal array } IMAGE_EXPORT_DIRECTORY, *PIMAGE_EXPORT_DIRECTORY;

Export Address Table - 3 그렇다면 “AddAtomW” 함수를 kernel32.dll 에서 어느 위치에 있는지 어떻게 알아낼 수 있을까 ? 1. AddressOfNames 멤버의 값으로 이동 2. AddressOfNames 의 값으로 가면 문자열 주소가 저장되어 있음. 문자열 비교를 통하여 원하는 함수 이름을 찾음. 이 때의 배열 인덱스를 "idx" 라고 하겠습니다. 3. AddressOfNameOrdinals 멤버의 값을 통해 "ordinal 배열 " 로 이동 4. "ordinal 배열 " 에서 "idx" 로 해당 "ordinal_idx" 값을 찾습니다. 5. AddressOfFunctions 로 이동하여 ordinal_idx 멤버를 이용해 함수의 시작 주소를 얻습니다.

Export Address Table - 4 실제 kernel32.dll 파일의 EAT 에서 AddAtomW 함수 주소를 찾는 과정 앞에서 kernel32.dll 의 IMPORT_EXPORT_DIRECTORY 구조체 file offset 은 1A2Ch 였음 Characteristics = h TimeDateStamp = 49C4D12Eh MajorVersion = 0000h MinorVersion = 0000h Name = 00004B98h Base = h NumberOfFunctions = BAh NumberOfNames = BAh AddressOfFunctions = h AddressOfNames = Ch AddressOfNameOrdinals = h AddressOfNames 멤버의 값은 RVA = 353Ch 이므로 file offset = 293Ch

Export Address Table - 5 file offset = 293Ch [0x00003FBD] 를 따라가보면, … 찾았다. AddAtomW 를 찾았음 RVA = 4BBDh 은 file offset = 3FBDh Characteristics = h TimeDateStamp = 49C4D12Eh MajorVersion = 0000h MinorVersion = 0000h Name = 00004B98h Base = h NumberOfFunctions = BAh NumberOfNames = BAh AddressOfFunctions = h AddressOfNames = Ch AddressOfNameOrdinals = h AddressOfFunctions 멤버의 값은 RVA = 2654h 이므로 file offset = 1A54h AddressOfFunctions[ordinal(2)] = 326F1 kernel32.dll 의 ImageBase = 7C7D0000h 입니다. 따라서 "AddAtomW" 함수의 실제 주소 (VA) 는 7C8026F1h

로더 제작 및 시연 37

38 - END -