Win32 실행파일 (PE) 의구조 Windows 운영체제실행파일의구조에대하여알아보자 Kali-KM
|
|
- 채환 왕
- 5 years ago
- Views:
Transcription
1 Win32 실행파일 (PE) 의구조 Windows 운영체제실행파일의구조에대하여알아보자 Kali-KM
2 2 목차 1. 개요 PE 파일의전체구조 PE 분석을위한개념정리... 8 (1) RVA (Relative Virtual Address)... 8 (2) Section... 8 (3) VAS (Virtual Address Space) IMAGE_DOS_HEADER & IMAGE_DOS_STUB IMAGE_NT_HEADER (1) IMAGE_FILE_HEADER (2) IMAGE_OPTIONAL_HEADER (3) IMAGE_SECTION_HEADER Section (1) Code Section (2) Data Section (3) Export Section (4) Import Section (5) Relocation Section API Hooking (1) DLL Injection (2) IAT Hooking... 33
3 3 그림 그림 1. HxD로본 PE 구조... 5 그림 2. 일반적인 PE 구조의형태... 6 그림 3. PE View로본 IMAGE_DATA_DIRECTORY... 7 그림 4. 대표적인섹션의종류 그림 5. CreateFileMapping API 그림 6. flprotect 항목 그림 7. MapViewOfFile API 그림 8. dwdesiredaccess 항목 그림 9. UnmapViewOfFile API 그림 10. CloseHandle API 그림 11. 파일과프로세스에서의 PE 시작점 그림 12. IMAGE_DOS_HEADER 구조체 그림 13. 예제.exe의 IMAGE_DOS_STUB 그림 14. 필수적이지않은요소제거 그림 15. IMAGE_NT_HEADER 구조체 그림 16. IMAGE_FILE_HEADER 구조체 그림 17. Characteristics의주요 PE 특성 그림 18. IMAGE_OPTIONAL_HEADER 구조체 그림 19. IMAGE_DATA_DIRECOTRY 구조체 그림 20. IMAGE_DATA_DIRECTORY ENTRY 그림 21. IMAGE_SECTION_HEADER 구조체 그림 22. IMAGE_SECTION_HEADER 속성값 그림 23. 예제.exe의.text 섹션 그림 24. 예제.exe의.text 섹션 어셈블리코드... 22
4 4 그림 25. 예제.exe의몇가지필드값 그림 26. 예제.exe의.data Section 그림 27. IMAGE_EXPORT_DIRECTORY 구조체 그림 28. 예제.dll의.edata 섹션 그림 29. IMAGE_IMPORT_DESCRIPTOR 구조체 그림 30. INT와 IAT 그림 31. IAT에함수주소기록과정 그림 32. IMAGE_BASE_RELOCATION 구조체 그림 33. TypeOffset 엔트리구조 그림 34. a.dll의재배치섹션 그림 35. 재배치해야할주소확인 그림 36. 재배치할주소의명령어 그림 37. CreateRemoteThread API 그림 38. AppInit_DLLs Registry Key 그림 39. 메시지전달방식 그림 40. SetWindowsHookEx API 그림 41. SetWindowsHookEx를이용한후킹 그림 42. 일반적인 API 호출과정 그림 43. 후킹된 API 호출과정... 34
5 5 1. 개요 우리가컴퓨터로무엇인가작업하기위해서는언제나특정프로그램을실행시킨다. 이러한실행파일또는응용프로그램이라불리는 EXE 파일말고도프로그램실행을위한 DLL 파일도프로그램실행시에같이물려메모리상에로드된다. 이러한 EXE 파일관련 DLL 파일들이메모리상에로드되면서비로소프로그램이라는것이사용가능하게되고이렇게로드된하나의 EXE와여러개의관련 DLL들이소위운영체제론에서이야기하는하나의프로세스를구성하게된다. 그림 1. HxD로본 PE 구조이러한실행파일들은항상 MZ라는식별가능한문자로시작하는데이는무의미한문자가아니라 PE(Portable Executable) 구조로된 PE 파일들을나타낸다. PE파일은이름과같이플랫폼에관계없이 Win32 운영체제가돌아가는시스템이면어디서든실행가능하다는의미를지니고있다. 따라서우리는이러한 PE파일의구조를중점적으로알아볼것이다
6 6 2. PE 파일의전체구조 PE 파일의전체적인구조에대하여알아보자. PE 파일은아래의그림과같은형태로 MZ 가위치하고있는 IMAGE_DOS_HEADER를시작으로프로그램의많은정보를구조체형태로포함하고있다. 도스헤더의경우 PE파일임을구별할수있도록시작부분에 MZ Signature(4D5A) 로시작한다. 그다음도스스텁이나오는데이는필수적이지않은존재로 16 Bit 환경에서출력될문자열인 This program cannot be run in DOS mode 라는문자열등을포함하고있다. 그림 2. 일반적인 PE 구조의형태그다음본격적인 PE Signature(5045) 가존재하고있는 IMAGE_NT_HEADERS로이부분은크게 IMAGE_FILE_HEADER와 IMAGE_OPTIONAL_HEADER 두부분으로나눌수가있다. FILE 헤더의경우 PE 파일에대한파일정보를나타내고 OPTIONAL 헤더의경우 PE 파일이메모리에로드될때
7 7 필요한모든정보들을담고있다. OPTIONAL_HEADER 내에는기본필드들과함께주요섹션들의 위치와크기를나타내는 IMAGE_DATA_DIRECTORY 구조체배열을담고있다. 이에대해선추후에 더자세히설명할것이다. 그림 3. PE View로본 IMAGE_DATA_DIRECTORY IMAGE_DATA_DIRECTORY를끝으로 IMAGE_SECTION_HEADER가여러개나오는데, 이는섹션테이블로각섹션의위치와크기등의정보를포함하고있다. MZ헤더부터섹션테이블까지 PE 파일헤더라하며, PE 헤더뒷부분부터는실제코드나데이터들이성격에맞게각각의섹션에위치하고있다.
8 8 3. PE 분석을위한개념정리 PE 파일구조를분석하기전에알아야할내용들에대하여언급할것이다. RVA, Section, MMF, VSA 에대하여알아보자. (1) RVA (Relative Virtual Address) RVA는상대적가상주소로파일 Offset과는다른개념이다. Offset은파일에서의위치를나타낼때사용하는개념이지만 RVA는가상주소공간상의위치를나타낼때사용하는개념으로메모리상에서의 PE의시작주소에대한오프셋으로생각하면된다. 그렇다면메모리에서는왜 Offset 이나 VA가아닌 RVA로나타낼까? 이는 PE 파일이지정된베이스위치 (ImageBase) 를기준으로로딩된다는보장이없기때문이다. EXE 파일의경우일반적으로파일이지정된위치에로드된다. DLL의경우일반적으로 ImageBase 값이 0x 으로설정되어있지만하나의프로세스에는여러개의 DLL이존재하고있기때문에 ImageBase를기준으로할경우중첩된다. 이러한중첩을방지하기위해 DLL Relocation이존재하고있으며이러한이유로인해절대주소가아닌상대주소를사용한다. 만약 ImageBase가 0x 이며 RVA 값이 0x1234라고한다면가상주소의값은 0x 이되는것이다. (2) Section PE 파일에서섹션은 PE가가상주소공간에로드된다음실제내용을담고있는블록들이다. 대 표적인내용으로는명령어코드와데이터이며, 그외에실행에관련된여러정보들이섹션에배 치된다. 대표적으로언급할만한섹션들에대하여간단히알아보자. 종류 이름 설명 코드.text 프로그램을실행하기위한코드를담고있는섹션으로, 명령포인터는이섹션내에존재하는번지값을담게된다. 데이터.data 초기화된전역변수들을담고있는읽고쓰기가능한섹션이다..rdata 읽기전용데이터섹션으로문자열표현이나 C++/COM 가상함수테이블등이.rdata에배치되는항목중의하나이다..bss 초기화되지않은전역변수들을위한섹션이다. 실제 PE 파일내에서는존재하지만가상주소공간에매핑될때에는보통.data 섹션에병합되어메모리상에서는따로존재하지않는다. Import API 정보.idata 임포트할 DLL과그 API들에대한정보를담고있는섹션이다. 대표적으로 IAT가존재한다.
9 9.didat 지연로딩 (Delay-Loading) 1 임포트데이터를위한섹션으로지연 로딩은 Windows 2000부터지원되는 DLL 로딩의한방식으로암시적인방식과명시적인방식의혼합이다. Export API 정보.edata 익스포트할 DLL과그 API들에대한정보를담고있는섹션이다. 보통 API나변수를익스포트할수있는경우는 DLL이기때문에 DLL PE에이섹션이존재한다. 리소스.rsrc 다이얼로그, 아이콘, 커서등의윈도우 APP 리소스관련데이터들이이섹션에배치된다. 재배치정보.reloc 실행파일에대한기본재배치정보를담고있는섹션이다. 재배치란 PE 이미지를원하는기본주소에로드하지못하고다른주소에로드했을경우코드상에서의관련주소참조에대한정보를갱신해야하는경우를말한다. 위에서언급한바와같이주로 DLL 파일에서재배치가일어난다. TLS.tls declspec(thread) 지시어와함께선언되는스레드지역저장소를위한섹션이다. 이섹션에는런타임이필요로하는부가적인변수나 declspec(thread) 지시어에의한데이터의초기값을포함한다. C++ 런타임.crt C++ 런타임 (CRT) 을지원하기위해추가된섹션으로정적 C++ 객체의생성자와소멸자를호출할때이용되는함수포인터가예이다. Short.sdata 전역포인터에상대적으로주소지정될수있는읽고쓰기가능한 Short 데이터섹션이다. IA-64 같은전역포인터레지스터를사용하는플랫폼을위해사용된다..srdata.sdata에들어갈수있는데이터들의읽기전용섹션이다. 예외정보.pdata IMAGE_RUNTIME_FUNCTION_ENTRY 구조체의배열을가지며예 외 정보를 담고 있는 섹션이다. 이 섹션의 위치는 IMAGE_DIRECTORY_ENTRY_EXCEPTION 슬롯을통해알수있으며, Table-base exception handling을사용하는플랫폼에서지원된다. 이를지원하지않는유일한플랫폼은 x86 계열의 CPU이다. 디버깅.debug$S OBJ파일 2 에존재하는가변길이코드뷰심벌레코드의스트림이다..debug$T OBJ파일에존재하는가변길이코드뷰심벌레코드의스트림이다. 1 프로그램실행시로드되는 DLL이많을경우초기화시간이길어지기에, 프로세스수행중해당함수가호출되는시점에서 DLL을로딩하도록하여초기화시간을단축하고자할때사용한다. 2 컴파일러에의해생성되는기계어명령문을 Object Code 라하며, 이를포함한디스크상의파일을 Object File 이라고한다.
10 10.debug$P 미리컴파일된헤더를사용했을때 OBJ 파일에만존재한다. Directives.drectve OBJ 파일에만존재하는섹션으로 Directives란링커명령라인을통해전달할수있는 ASCII 문자열을말한다. 그림 4. 대표적인섹션의종류 (3) VAS (Virtual Address Space) 마지막으로고려할것은파일로존재하는 PE구조와이것이메모리에올라올때주어지는가상주소공간 (VAS) 에서의 PE 구조에대한관계이다. 이를위해 MMF(Memory Mapped File) 에대하여먼저알아보자. 32비트환경에서프로세스는 4GB의 VAS를갖는데, 이가상공간을실제의물리적인기억장치와연결시켜주는것이가상메모리관리자 (Virtual Memory Manager, VMM) 이다. 여기서물리적기억장치는 RAM 뿐만아니라하드디스크상의특정파일 ( 기본적으로는 PageFile.sys) 을포함한다. 이와함께페이징기법을통해프로세스에게실제로 4GB의주소공간을가진것처럼사용할수있다. 페이징파일과 RAM 그리고 VAS는 VMM에의해관리되며프로세스에속한특정스레드가가상주소공간내의특정번지에접근하고자할때, VMM은해당번지의페이지를페이징파일과매핑시켜준다. 매핑된페이지는접근가능한상태가되며, 여기서이러한페이징은반드시 PageFile.sys하고만이루어져야하는것은아니라일반파일을메모리에맵핑하여이에대해페이징할수있다. 이처럼일반적인파일이 PageFile.sys의역할을대신하는경우를 MMF라고한다. 이제 MMF를사용하기위한함수에대하여알아보자. HANDLE CreateFileMapping( HANDLE hfile, LPSECRITY_ATTRIBUTES lpattributes, DWORD flprotect, DWORD dwmaximumsizehigh, DWORD dwmaximumsizelow, LPCTSTR lpname); 그림 5. CreateFileMapping API CreateFileMapping API는운영체제에게매핑을수행할파일의물리저장소를알려주기위한 API 이다. 이를통해지정파일을파일매핑오브젝트와연결시키며, 파일매핑오브젝트를위한충분한물리저장소가존재한다는것을확인시킨다. hfile의경우 CreateFile() 과같은 API를통해얻은파일의핸들로물리저장소로사용할파일의핸들을주어야한다. flprotect는 MMF의페이지속성을지정하는데 PAGE_READONLY, PAGE_READWRITE, PAGE_WRITECOPY와같은세가지보호속성을기본으로가진다. 이세가지보호속성외에다섯가지메모리매핑파일만의속성을추가로지정할수있다.
11 11 속성설명 SEC_NOCACHE 메모리매핑파일에대한캐싱을수행하지못하게한다. SEC_IMAGE 매핑한파일이 PE파일이미지임을알려주므로실행파일실행시사용 SEC_RESERVE 이두개는배타적으로사용되어야한다. 스파스메모리맵파일과관 SEC_COMMIT 련이있다. SEC_LARGE_PAGES 큰페이지할당기능과관련있다. 그림 6. flprotect 항목하지만파일매핑오브젝트를생성한다하더라도, 시스템은곧바로프로세스의주소공간상에영역을예약하지않는다. 그렇기에파일의데이터에접근하기위한영역을프로세스주소공간내에확보해야하며, 이영역에임의의파일을물리저장소로사용하기위한커밋단계를거쳐야하며이를위해사용하는 API가바로 MapViewOfFile이다. PVOID MapViewOfFile( HANDLE hfilemappingobject, DWORD dwdesiredaccess, DWORD dwfileoffsethigh, DWORD dwfileoffsetlow, DWORD dwnumberofbytestomap); 그림 7. MapViewOfFile API 첫번째인자는 CreateFileMapping으로얻은핸들을넘겨주면되고두번째인자에사용할수있는항목은아래와같다. 세번째와네번째인자의경우파일의어디부터매핑할것인지지정해주는것으로파일의오프셋값은반드시시스템의할당단위의배수여야한다. 마지막인자의경우얼마만큼해당할지설정하는것으로값이 0일경우오프셋으로부터파일의끝까지구성한다. 항목설명 FILE_MAP_READ CreateFileMapping에서 PAGE_READ_ONLY로설정한경우 FILE_MAP_WRITE CreateFileMapping에서 PAGE_READWRITE로설정한경우 FILE_MAP_ALL_ACCESS FILE_MAP_READ FILE_MAP_WRITE FILE_MAP_COPY와같다. FILE_MAP_COPY CreateFileMapping에서 PAGE_WRITECOPY로설정한경우로, 데이터를쓰면새로운페이지가생성된다. FILE_MAP_EXECUTE 데이터를코드로수행할수있다. 그림 8. dwdesiredaccess 항목이렇게 MMF를형성할수있으며프로세스주소공간내에매핑된데이터파일을더이상유지할필요가없다면 UnmapViewOfFile 함수를호출하여영역을해제해주어야한다. 사용되는인자는하나뿐이며해제할영역의주소를넘겨주면된다.
12 12 BOOL WINAPI UnmapViewOfFile( _In_ LPCVOID lpbaseaddress); 그림 9. UnmapViewOfFile API 마지막으로이전에얻어온파일오브젝트와파일매핑오브젝트가올바르게반환이이루어질수있도록 CloseHandle API를호출해주어야한다. 사용되는인자는역시하나로핸들을넘겨주어야한다. BOOL WINAPI CloseHandle( _In_ HANDLE hobject); 그림 10. CloseHandle API 이렇게 MMF를사용하는방법에대하여알아보았다. 사실이 MMF에대하여공부하며어느곳에사용해야하는것인지의문을가질수가있다. 이렇게 MMF에대하여자세히알아본이유가무엇일까? 바로 Windows는 EXE나 DLL 등의실행파일을로드할때 MMF를이용한다. 즉, PE 파일을페이징파일로복사하는것이아니라그파일자체를페이징파일로사용한다는것이다. <File> D 5A 6C FF FF E F D 21 0D 0A Win32 Program! B4 09 BA CD 21 B4 4C CD $??? 퀽?` F 4C 69 6E 6B 2C F D GoLink, GoAsm ww E 47 6F F 6F 6C 2E 63 6F 6D 00 w.godevtool.com C BB F PE..L. 새G... <Process> D 5A 6C E F D 21 0D 0A Win32 Program! B4 09 BA CD 21 B4 4C CD $??? 퀽?` F 4C 69 6E 6B 2C F D GoLink, GoAsm ww E 47 6F F 6F 6C 2E 63 6F 6D 00 w.godevtool.com C BB F PE..L. 새G... 그림 11. 파일과프로세스에서의 PE 시작점위두개의바이너리를보자. 파일에서의바이너리와할당된가상주소에서의바이너리가주소만다르지내용은같다는것을확인할수있다. 이는해당파일자체가그대로가상주소공간에매핑된다는것으로, EXE나 DLL 와같은 PE 파일을실행할때 PE 파일내에정의된바와같이가상주소공간에매핑된다는것이다. 지금까지 PE의개략적인구조와 RVA, Section, 그리고 PE와 MMF의관계에대해알아보았다. 다음장부터는구체적으로 PE 파일에대하여알아보자.
13 13 4. IMAGE_DOS_HEADER & IMAGE_DOS_STUB PE 파일에서가장처음으로등장하는영역은바로도스헤더와도스스텁영역이다. 도스헤더에 는총 64 Bytes 로 19 개의필드를갖지만, 실제로중요한필드는단두개뿐이다. e_magic 필드는 MZ 헤더의시그니처가존재하는필드로 PE 파일이맞는지아닌지체크할때사용되며, 이는도 스헤더의시작을알리는코드라할수있다. e_lfanew 필드는 NT 헤더의시작위치를나타내는 값으로해당오프셋을확인해보면 NT 헤더의시그니처인 PE 가존재하고있다. typedef struct _IMAGE_DOS_HEADER { WORD e_magic; /* 00: MZ Header signature */ WORD e_cblp; /* 02: Bytes on last page of file */ WORD e_cp; /* 04: Pages in file */ WORD e_crlc; /* 06: Relocations */ WORD e_cparhdr; /* 08: Size of header in paragraphs */ WORD e_minalloc; /* 0a: Minimum extra paragraphs needed */ WORD e_maxalloc; /* 0c: Maximum extra paragraphs needed */ WORD e_ss; /* 0e: Initial (relative) SS value */ WORD e_sp; /* 10: Initial SP value */ WORD e_csum; /* 12: Checksum */ WORD e_ip; /* 14: Initial IP value */ WORD e_cs; /* 16: Initial (relative) CS value */ WORD e_lfarlc; /* 18: File address of relocation table */ WORD e_ovno; /* 1a: Overlay number */ WORD e_res[4]; /* 1c: Reserved words */ WORD e_oemid; /* 24: OEM identifier (for e_oeminfo) */ WORD e_oeminfo; /* 26: OEM information; e_oemid specific */ WORD e_res2[10]; /* 28: Reserved words */ DWORD e_lfanew; /* 3c: Offset to extended header */ } IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER; 그림 12. IMAGE_DOS_HEADER 구조체 IMAGE_DOS_STUB 은아래와같은형태를띄고있으며큰의미를갖지않는다. 아래의표를보면 식별가능한문자열이존재하고있는데이는 MS-DOS 나윈도우 3.1 에서실행하게되면바로이 문장을출력한다. MS-DOS 스텁은위문장을출력하기위한 16 비트도스용응용프로그램이라할 수있다 F D 20 6D This program mus E E t be run under W E D 0A in32..$7... 그림 13. 예제.exe 의 IMAGE_DOS_STUB 이렇게도스헤더와도스스텁에대하여알아보았는데, 결국이두구조체에서필수적인항목은 단두개뿐인것이다. 다시말해, 다른필드의항목들은모두 NULL 이되어도상관없다는것이다. 한번직접코드를비교해보자. 아래는불필요한항목들을제거하지않은상태의코드와불필요한 항목들을제거한다음의코드를비교한것이다.
14 14 < 수정전 > : 4D 5A F 00 FF FF MZP : B A @ : : : BA E 1F B4 09 CD 21 B8 01 4C CD !..L.! : F D 20 6D This program mus : E E t be run under W : 69 6E D 0A in32..$7... < 수정후 > : 4D 5A MZ : : : : : : : 그림 14. 필수적이지않은요소제거코드를이렇게수정을해도프로그램이정상적으로구동되는것을확인할수있을것이다. 각필드마다의미를가지고있기는하지만, PE 구조에서는이러한정보들이존재하지않더라도정상적으로구동하도록되어있다.
15 15 5. IMAGE_NT_HEADER IMAGE_DOS_HEADER 의 e_lfanew 필드값에해당하는위치에 IMAGE_NT_HEADER 가존재하고있 다. 해당구조체에는 PE 와관련된주요필드들이위치해있다. 우선해당위치에는 PE Signature, IMAGE_FILE_HEADER, IMAGE_OPTIONAL_HEADER 로분류할수있다. 아래의구조체를확인해보자. typedef struct _IMAGE_NT_HEADERS { DWORD Signature; /* "PE"\0\0 */ /* 0x00 */ IMAGE_FILE_HEADER FileHeader; /* 0x04 */ IMAGE_OPTIONAL_HEADER32 OptionalHeader; /* 0x18 */ } IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32; 그림 15. IMAGE_NT_HEADER 구조체 (1) IMAGE_FILE_HEADER IMAGE_FILE_HEADER 에는해당 PE 파일과관련된내용이존재하고있는 20 Bytes 로구성된구조 체이다. 첫번째필드에는 CPU 의 ID 를나타내는것으로세가지주요타입은다음과같이 Intel 386 의경우 0x014C, Intel 64 의경우 0x200, AMD64 의경우 0x8664 의값을갖는다. 두번째필드 의경우본파일에서섹션의수를나타내는것이며세번째필드 TimeDataStamp 는파일이 OBJ 형식의파일이면컴파일러가, EXE 나 DLL 과같은 PE 파일이라면링커가해당파일을만들어낸시 간을의미한다. PointerToSymbolTable 의경우 COFF 심벌의파일오프셋을나타내는것으로, 이필드는컴파일러 에의해생성되는 OBJ 파일이나디버그모드로만들어져 COFF 디버그정보를가진 PE 파일에서 만사용된다. 그다음 NumberOfSybols 는 PointerToSymbolTable 필드가가리키는 COFF 심벌테 이블내의심벌수를나타낸다. IMAGE_FILE_HEADER 다음에는 IMAGE_OPTIONAL_HEADER 가이어 서나오는데바로해당구조체의크기를나타내는것이 SizeOfOptionalHeader 필드이다. 마지막 으로 Chracteristics 필드는해당 PE 파일에대한특정정보를나타내는플래그로주요항목몇가 지가 [ 그림 17] 과같다. typedef struct _IMAGE_FILE_HEADER { WORD Machine; WORD NumberOfSections; DWORD TimeDateStamp; DWORD PointerToSymbolTable; DWORD NumberOfSymbols; WORD SizeOfOptionalHeader; WORD Characteristics; } IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER; 그림 16. IMAGE_FILE_HEADER 구조체 매크로명값의미 IMAGE_FILE_RELOCS_STRIPPED 0x0001 현재파일에재배치정보가없다.
16 16 IMAGE_FILE_EXECUTABLE_IMAGE 0x0002 본파일은실행파일이미지이다. IMAGE_FILE_LINE_NUMS_STRIPPED 0x0004 본파일에라인정보가없다. IMAGE_FILE_LOCAL_SYMS_STRIPPED 0x0010 OS로하여금적극적으로워킹셋을정리할수있도록한다. IMAGE_FILE_LARGE_ADDRESS_AWARE 0x0020 응용프로그램이 2GB 이상의가상주소번지를제어할수있도록한다. IMAGE_FILE_32BIT_MACHINE 0x0100 본 PE는 32비트워드머신을필요로한다. IMAGE_FILE_DEBUG_STRIPPED 0x0200 디버그정보가본파일에없고.DBG 파일에존재한다. IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP 0x0400 PE이미지가이동가능장치위에존재하면고정디스크상의스왑파일로카피해실행한다. IMAGE_FILE_NET_RUN_FROM_SWAP 0x0800 PE이미지가네트워크상에존재하면고정디스크상의스왑파일로카피해서실행한다. IMAGE_FILE_DLL 0x2000 본파일은동적링크라이브러리 (DLL) 파일이다. IMAGE_FILE_UP_SYSTEM_ONLY 0x4000 본파일은하나의프로세서만을장착한머신에서실행된다. 그림 17. Characteristics의주요 PE 특성 (2) IMAGE_OPTIONAL_HEADER IMAGE_FILE_HEADER 의뒷부분에나오는 IMAGE_OPTIONAL_HEADER 구조체에는메모리에올라갈 때참조해야할주요한필드들이위치하고있다. 해당구조체는총 224 Bytes 의크기를갖으며많 은필드가위치해있다. 아래의구조체를보자. typedef struct _IMAGE_OPTIONAL_HEADER { /* Standard fields */ WORD Magic; /* 0x10b or 0x107 */ /* 0x00 */ BYTE MajorLinkerVersion; BYTE MinorLinkerVersion; DWORD SizeOfCode; DWORD SizeOfInitializedData; DWORD SizeOfUninitializedData; DWORD AddressOfEntryPoint; /* 0x10 */ DWORD BaseOfCode; DWORD BaseOfData; /* NT additional fields */ DWORD ImageBase; DWORD SectionAlignment; /* 0x20 */ DWORD FileAlignment; WORD MajorOperatingSystemVersion; WORD MinorOperatingSystemVersion; WORD MajorImageVersion; WORD MinorImageVersion; WORD MajorSubsystemVersion; /* 0x30 */ WORD MinorSubsystemVersion;
17 17 DWORD Win32VersionValue; DWORD SizeOfImage; DWORD SizeOfHeaders; DWORD CheckSum; /* 0x40 */ WORD Subsystem; WORD DllCharacteristics; DWORD SizeOfStackReserve; DWORD SizeOfStackCommit; DWORD SizeOfHeapReserve; /* 0x50 */ DWORD SizeOfHeapCommit; DWORD LoaderFlags; DWORD NumberOfRvaAndSizes; IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]; /* 0x60 */ /* 0xE0 */ } IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32; 그림 18. IMAGE_OPTIONAL_HEADER 구조체 첫번째필드인 Magic 은 IMAGE_OPTIONAL_HEADER 를나타내는 Signature 로 32 비트 PE 의경우 0x010B 이고, 64 비트 PE 의경우 0x020B, ROM 이미지파일에대해서는 0x0107 의값을갖고있는 것을확인할수있다. MajorLinkerVersion 과 MinorLinkVersion 는본파일을만들어낸링커의버전 을나타낸다. SizeOfCode 의경우코드섹션 (.text) 섹션의크기이며 SizeOfInitializedData, SizeOfUninitializedData 의경우각각코드섹션을제외한 초기화된데이터섹션의크기 와 초기 화되지않은데이터섹션의크기 를나타낸다. AddressOfEntryPoint 는로더가실행을개시할주소를나타낸다. 이주소는 RVA 로서보통.text 섹 션내의특정번지가된다. 이필드의값은프로그램이처음으로실행될코드를담고있는주소 이다. 즉, 프로그램이로드된후이프로세스의메인스레드문맥의 EIP 레지스터가가질수있는 최초의값이라할수있다. BaseOfCode, BaseOfData 의경우각각첫번째코드섹션이시작되는 RVA, 데이터섹션이시작되는 RVA 를의미한다. ImageBase 필드는해당 PE 가가상주소공간에매핑될때매핑시키고자하는메모리상의시작 주소이다. 일반적으로 EXE 파일의 ImageBase 값은 0x 이며 DLL 의경우 0x 이지만, DLL 의경우하나의 VAS 에여러 DLL 이존재할수있으므로 DLL Relocation 을필요로하게된다. PE 파일은섹션으로나뉘어져있는데파일에서섹션의최소단위를나타내는것이 FileAlignment 이며메모리에서섹션의최소단위를나타내는것이 SectionAlignment 이다. 각섹션의시작주소 는언제나각필드의배수가되는주소가되도록보장해야한다. MajorOperatingSystemVersion, MinorOperatingSystemVersion 은해당 PE 를실행하는데필요한운 영체제의최소버전을의미한다. MajorImageVersion 과 MinorImageVersion 은유저가정의가능한 필드로, 제작할때 PE 파일에제작자가버전을기입할수있도록하는것이다. MajorSubsystem 과 MinorSubsystem 은본 PE 를실행하는데필요한서브시스템의최소버전을의미한다. Win32VersionValue 는이전엔예약필드였지만 VC 부터는이름을가지게되었다. 하지만거
18 18 의사용되지않으며보통 0으로설정된다. SizeOfImage는 PE 파일이메모리에로딩되었을때의전체크기를담고있으며이값은 SectionAlignment 필드값의배수가되어야한다. SizeOfHeaders는 PE 헤더의전체크기를나타내는것으로이값역시 FileAlignment의배수가되어야한다. CheckSum 필드는이미지의체크섬값을의미한다. PE 파일의체크섬값은 IMAGEHELP.DLL의 CheckSymMappedFile API를통해서얻을수있다. 체크섬값은커널모드드라이버나어떤시스템 DLL의경우요구된다. 그이외의경우라면보통 0으로설정된다. 그리고 Subsystem 필드의경우 sys 파일과같이디바이스드라이버같은경우 1의값을가지고 Windows GUI 프로그램의경우윈도우기반응용프로그램의경우 2, 마지막으로 CMD와같은콘솔기반응용프로그램은 3의값을갖는다. DllCharacteristics 필드는원래 PE가 DLL이라는전제하에어떤상황에서 DLL 초기화함수가호출되어야하는지를지시하는플래그였다. 하지만지금은대부분 0으로설정되어있는것을확인할수있다. SizeOfStackReserve, SizeOfStackCommit, SizeOfHeapReserve, SizeOfHeapCommit 필드에대하여알아보자. 프로세스는가상주소공간에자신만의스택과힙을별도로가진다. 따라서프로세스생성시시스템은언제나메인스레드를위한디폴트스택과프로세스를위한디폴트힙을해당프로세스내에생성시켜주는데, 이스택과힙의크기와속성에관계된설정을이필드들에지정하게된다. PE가메모리에로드될때시스템은이필드의값을참조하여해당프로세스에디폴트스택과힙을만들어준다. LoaderFlags 필드는이전에는디버깅지원에관계된목적으로존재하는것같지만, 현재는 0으로설정된다. NumberOfRvaAndSize 필드는바로뒤에나오는 IMAGE_DATA_DIRECTORY 구조체배열의원소개수를의미하는데, 이값은항상 16(0x10) 이다. typedef struct _IMAGE_DATA_DIRECTORY { DWORD VirtualAddress; DWORD Size; } IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY; 그림 19. IMAGE_DATA_DIRECOTRY 구조체 IMAGE_DATA_DIRECTORY는구조체의배열로, 배열의각항목마다정의된값을가지게된다. 각항목은위와같이 VirtualAddress와 Size 필드로구성되어있으며각 16개의구조는다음과같은의미를가진다. ENTRY 설명 IMAGE_DIRECTORY_ENTRY_EXPORT Export Section의시작주소를가리킨다. IMAGE_DIRECTORY_ENTRY_IMPORT Import Section의시작주소를가리킨다
19 19 IMAGE_DIRECTORY_ENTRY_RESOURCE Resource Section의시작주소를가리킨다. IMAGE_DIRECTORY_ENTRY_EXCEPTION 예외핸들러테이블을가리킨다. IMAGE_DIRECTORY_ENTRY_SECURITY WinTrust.h에정의된 WIN_CERTIFICATE 구조체 들의리스트의시작번지를가리킨다. 이리스 트는메모리상에 매핑되지않기 때문에 VirtualAddress필드는 RVA가아닌 Offset이다. IMAGE_DIRECTORY_ENTRY_BASERELOC ImageBase를기준으로메모리에매핑되지않 을경우코드상의포인터연산과관련된주 소를다시갱신해야하는 재배치 가일어나야 하는데, 이를위한재배치섹션을가리킨다. IMAGE_DIRECTORY_ENTRY_DEBUG 해당이미지의디버그정보를기술하고있는 곳을가리킨다. IMAGE_DIRECTORY_ENTRY_ARCHITECTURE IMAGE_ARCHITECTURE_HEADER 구조체의배 열에대한포인터이다. x86 또는IA-64계열에서 는사용되지않는다. IMAGE_DIRECTORY_ENTRY_GLOBALPTR 글로벌포인터 (GP) 로사용되는 RVA를나타내 며 Size필드는사용되지않는다. IMAGE_DIRECTORY_ENTRY_TLS Thread Local Storage 초기화섹션에대한포 인터이다. IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG IMAGE_LOAD_CONFIG_DIRECTORY 구조체에 대한포인터이다. IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT DLL 바인딩과관련된정보를담고있는곳을 가리키는포인터이다. IMAGE_DIRECTORY_ENTRY_IAT 첫번째 IAT의시작번지를가리키며 Size 필 드는모든 IAT의전체크기를가리킨다. IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT 지연로딩에대한정보를가리키는포인터다. IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR.NET 응용프로그램이나 DLL 용 PE를위한것 으로 PE 내의.NET 정보에대한최상위정보 의시작번지를가리킨다. NULL 마지막엔트리는항상 NULL 값이다. 그림 20. IMAGE_DATA_DIRECTORY ENTRY (3) IMAGE_SECTION_HEADER PE 헤더바로다음엔 IMAGE_SECTION_HEADER 가나온다. 섹션헤더는각섹션의속성이정의되 어있는구조체로각섹션헤더마다 40 Bytes 로구성된다. 각필드에대하여알아보자. typedef struct _IMAGE_SECTION_HEADER { BYTE Name[IMAGE_SIZEOF_SHORT_NAME];
20 20 union { DWORD PhysicalAddress; DWORD VirtualSize; } Misc; DWORD VirtualAddress; DWORD SizeOfRawData; DWORD PointerToRawData; DWORD PointerToRelocations; DWORD PointerToLinenumbers; WORD NumberOfRelocations; WORD NumberOfLinenumbers; DWORD Characteristics; } IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER; 그림 21. IMAGE_SECTION_HEADER 구조체 Name 필드는섹션의아스키이름을나타내며만약섹션의이름이 8 Bytes 를넘을경우 8 Bytes 이후의문자열은잘린뒤이필드값을채운다. 또한이값은섹션의이름을참고할용도뿐이라 해당이름을바꾸어도프로그램의실행에는아무런지장이없다. PhysicalAddress 필드는이전엔 OBJ 파일에서섹션의물리적인번지를지정했지만, 지금은사용되 지않아 0 으로지정되어있다. VirtualSize 필드는메모리에서섹션이차지하는크기를나타낸다. VirtualAddress 는 PE 에서해당섹션을매핑시켜야할가상주소공간상의 RVA 를가지고있다. SizeOfRawData 는파일에서섹션이차지하는크기를나타낸다. 그리고 PointerToRawData 는파일 에서해당섹션의위치를나타낸다. PointerToRelocations 는본섹션을위한재배치파일오프셋으로 OBJ 파일에서만사용되고실행파 일에서는 0 이된다. PointerToLinenumbers 는본섹션을위한 COFF 스타일의라인번호를위한파 일오프셋이다. NumberOfRelocations 는 PointerToRelocations 필드가가리키는구조체배열의원소개수를나타 내며, NumberOfLinenumbers 는 PointerToLinenumbers 필드가가리키는구조체배열의원소개수 를나타낸다. 마지막으로 Characteristics 는해당섹션의속성을나타내는플래그의집합으로아래와같은속성 값이존재하고있다. 속성값 설명 IMAGE_SCN_CNT_CODE(0x20) 섹션이코드를포함하고있다. IMAGE_SCN_CNT_INITIALIZED_DATA(0x40) 섹션이초기화된데이터를포함하고있다. IMAGE_SCN_CNT_UNINITIALIZED_DATA(0x80) IMAGE_SCN_MEM_DISCARDABLE(0x ) IMAGE_SCN_MEM_NOT_CACHED(0x ) 섹션이초기화되지않은데이터 (ex.bss) 를가지 고있다. 이섹션은실행이미지가메모리에완전히매 핑되고난뒤버려질수있다. 해당섹션은페이지되지않거나캐쉬되지않
21 21 IMAGE_SCN_MEM_NOT_PAGED(0x ) 는다. 페이지되지않는다는것은페이지파일 로스왑되지않는다는것을의미하며이는항 상 RAM에존재하는섹션임을의미한다. IMAGE_SCN_MEM_SHARED(0x ) 이섹션은공유가능한섹션임을나타낸다. IMAGE_SCN_MEM_EXECUTE(0x ) 이섹션은실행가능하섹션임을나타낸다. IMAGE_SCN_MEM_READ(0x ) 이섹션은읽기가능한섹션이다. IMAGE_SCN_MEM_WRITE(0x ) 이섹션은쓰기가능한섹션이다. IMAGE_SCN_LNK_INFO(0x0x200) 해당섹션이링커에의해사용될주석이나다 른어떤종류의정보를가진다. IMAGE_SCN_LNK_REMOVE(0x800) 링크시에최종실행파일의일부가되지말 아야할섹션의내용들을지시한다. IMAGE_SCN_LINK_COMDAT 해당섹션의내용들은공용데이터이다. IMAGE_SCN_ALIGN_XBYTES _XBYTES의값으로 _1BYTES부터 _8192Bytes까 지의정렬단위를나타낸다. 특별히지정되지 않으면 디폴트로 16바이트에 해당하는 IMAGE_SCN_ALIGN_16BYTES가된다. 그림 22. IMAGE_SECTION_HEADER 속성값.code 섹션의경우주로 CNT_CODE, MEM_EXECUTE, 그리고 MEM_READ 속성값을가지며.data 섹션과.idata 섹션의경우 CNT_INITALIZED_DATA, MEM_READ, 그리고 MEM_WRITE의속성값을 가진다.
22 22 6. Section 각 PE 파일마다가지는섹션은다를수있지만, 대부분섹션은유사한기능을한다. 그러므로이 러한각섹션에대하여알아보자. (1) Code Section 코드섹션또는텍스트섹션은컴파일러나어셈블러가최종적으로생성하는일반목적코드가존재하는섹션으로실행명령어들이이곳에존재하고있다. 우선예제파일을통해실제코드섹션의내용을확인해보자. 아래의바이너리와같이우리가읽을수없는코드로이루어져있기때문에우리는기계어를해석하기위하여디스어셈블러와같은도구를사용하여야한다 : 6A A 00 E : E : B C A : 3B A 00 E EB 13 6A (skip) 그림 23. 예제.exe의.text 섹션디스어셈블러를통해해당섹션의내용을확인하면아래와같은명령어가위치해있는것을알수있다. 이러한명령어들이하나하나실행되면서프로그램의정의된대로동작하게된다. 실행의흐름을위하여 EIP 레지스터에는실행할명령어의위치가담겨있다 A 00 PUSH 0 ; /Style = MB_OK MB_APPLMODAL PUSH test ; Title = "abex' 1st crackme" PUSH test ; Text = "Make me think your HD is a CD- Rom." C. 6A 00 PUSH 0 ; howner = NULL E. E8 4E CALL <JMP.&USER32.MessageBoxA> ; \MessageBoxA...(skip) 그림 24. 예제.exe의.text 섹션 어셈블리코드 그렇다면왜파일에서의위치 (Offset) 은 0x600인데메모리에서의위치 (RVA) 는 일까? 아무이유없이이렇게메모리에올라오는것이아니라, 이전에언급한바와같이 ImageBase나해당섹션의 RVA, PointerToRawData 등에의해메모리에올라오면서정의된대로위치하게되는것이다. 해당프로그램의필드값몇가지를확인해보자. 필드이름 ImageBase RVA PointerToRawData 필드값 0x x1000 0x600
23 23 그림 25. 예제.exe의몇가지필드값우선코드섹션의 PointerToRawData는 0x600으로파일에서해당섹션의위치가 0x600임을알려준다. 그렇기에해당위치를확인해보면실행할코드가존재하고있는것을확인할수있다. 메모리에서해당섹션의위치는 RVA인 0x1000으로이에 ImageBase 값을더하면위그림에서의주소인 0x401000임을알수가있다. 이처럼 RVA와 RAW(Offset) 의주소의관계는직접코드를파일에서수정하고자할때와같은경우에, 이를변환할줄알아야한다. 코드섹션에실행을위한명령어들이있다고하여.text 섹션의첫부분이프로그램의실행을위한첫명령어가아니다. 흔히디버거를통해프로그램의시작부분으로이동되는주소는 Entry Point로 IMAGE_OPTIONAL_HEADER의 AddressOfEntryPoint에 ImageBase를더한위치가프로그램의시작주소가된다. (2) Data Section 데이터섹션은그종류가여러가지이다. 일반적으로.data라는이름을가진섹션이존재하며이안에.idata나.edata, 또는.rdata 섹션이존재하기도한다. 이에대해서는뒤에서상세히다룰것이다. 데이터섹션은그속성이읽기 / 쓰기가능한섹션으로전역변수나정적변수를정의하게되면이러한변수들이이섹션에위치하게된다. 아래는실제예제프로그램의데이터섹션이다. 해당데이터섹션에는 ASCII 형태의문자열들이존재하고있는것을확인할수있다 : B 6D abex' 1st crackm : D 61 6B D E 6B 20 e.make me think : 79 6F D your HD is a CD : 52 6F 6D 2E F E E 2E Rom..Error.Nah : 2E E 6F This is not a : D 52 4F 4D CD-ROM Drive!.YE : F 6B 2C C 6C 79 AH!.Ok, I really : E 6B F think that your : D 52 4F 4D 21 HD is a CD-ROM! : 20 3A A 5C :p.c:\... 그림 26. 예제.exe의.data Section 데이터섹션과유사.rdata 섹션은읽기전용데이터섹션으로해당섹션헤더를확인해보면 MEM_WRITE 속성이존재하지않는것을확인할수있다. 따라서이섹션에무엇인가기록하고자하면시스템은예외를나타내며프로그램이종료될것이다. 또한.rdata 섹션은이러한용도뿐만아니라다른섹션들이병합되는곳이기도하다. 이후에나올.edata나.idata 섹션이.rdata섹션에
24 24 병합되는경우도종종있다는것을잊지말자. (3) Export Section Export 섹션은주로 DLL에서나타나는섹션으로자신이가진함수의기능을외부프로그램이사 용할수있도록제공하는것이목적이다. 만약 A.exe와 B.exe라는프로그램이존재할때두프로 그램모두 TEST_Function() 이라는함수를정의하여사용하고있다고가정하자. 두프로그램에있 어 TEST_Function을각각써넣어주는것보단용량이나이후관리를위하여 TEST_Function() 을가 진 DLL을하나만든다음이를 Import하여사용할수있다. 반대로해당 DLL은 Export를제공하 는것이다. 먼저 Export Section의 IMAGE_EXPORT_DIRECTORY 구조체에대하여알아보자. 해당구조체는 Export Section에서가장중요한정보들을담고있는구조체이며, IAT와는다르게 PE 파일당하나 만존재한다. 해당필드의목록은아래의그림과같다. typedef struct _IMAGE_EXPORT_DIRECTORY { DWORD Characteristics; DWORD TimeDateStamp; WORD MajorVersion; WORD MinorVersion; DWORD Name; DWORD Base; DWORD NumberOfFunctions; DWORD NumberOfNames; DWORD AddressOfFunctions; DWORD AddressOfNames; DWORD AddressOfNameOrdinals; } IMAGE_EXPORT_DIRECTORY,*PIMAGE_EXPORT_DIRECTORY; 그림 27. IMAGE_EXPORT_DIRECTORY 구조체 첫번째부터필드는사용되지않으며두번째필드는해당파일이생성된시간을나타낸다. 그 다음버전과관련된필드역시사용되지않는다. 다섯번째 Name필드는해당 DLL의이름을나타 내는 ASCII 코드문자열의위치를지시하는 RVA이다. 파일에서해당 DLL의이름은 RVA를 RAW 로변환해주면해당 Offset에서이름을확인할수있다. Base 필드는 Export된함수들에대한서 수의시작번호이다. NumberOfFunctions는뒤에나오는 AddressOfFunctions 필드가가리키는 RVA 배열의원소개수 를나타낸다. AddressOfFunctions는 export된함수들의함수포인터를가진배열을가리킨 RVA 값으로이함수주소들은본모듈내에서각각 export된함수에대한엔트리포인터이다. NumberOfNames는 AddressOfNames 필드가 가리키는 RVA 배열의 원소 개수와 AddressOfNameOrdinals 필드가 가리키는 서수 배열의 원소 개수를 동시에 나타낸다. AddressOfNames 필드는 export된함수의심벌을나타내는문자열포인터배열을가리키는rva
25 25 값이고, AddressOfNameOrdinals는 export된모든함수들의서수를담고있는배열에대한포인 터이다. 여기서 NumberOfNames와 NumberOfFunctions은다를수있는데보통 NumberOfFunctions 필 드가더크거나같다. 하지만실제 export된함수의정확한개수는 NumberOfNames 필드의값이 다. 이렇게 IMAGE_EXPORT_DIRECTORY에대하여알아보았다. 아래는실제 DLL 파일의.edata 섹 션을분석한내용이다. 구조체 필드 값 IMAGE_EXPORT_DIRECTORY Characteristics 0000 TimeDateStamp 2009/07/13 23:38:00 UTC Major Version 0 Minor Version 0 Name RVA 10DA4(adsnsext.dll) Ordinal Base 1 Number Of Functions 2 Number Of Names 2 Address Of Functions 10D90 Address Of Names 10D98 Address Of Name Ordinals 10DA0 구조체 데이터 값 Export Address Table 2D6C DllCanUnloadNow 2D51 DllGetClassObject Export Name Pointer Table 10DB1 DllCanUnloadNow 10DC1 DllGetClassObject Export Ordinal Table 0001 DllCanUnloadNow 0002 DllGetClassObject 그림 28. 예제.dll의.edata 섹션 IMAGE_EXPORT_DIRECTORY 구조체외에 3개의 Export Table이존재하는것을확인할수있다. 하 나는 Export 함수포인터테이블이며다른하나는 Export 함수이름포인터테이블, 마지막으로 Export 함수서수테이블임을알수가있다. (4) Import Section DLL의입장에서는함수를 Export 해주었다면반대로그함수를사용하기위해선다른실행파일에서이를 Import 해주어야한다. 이렇게사용하고자 import 하는함수들과그 DLL에대한정보를가지고있는것이바로임포트섹션이다. 아래 IMAGE_IMPORT_DESCRIPTOR 구조체를확인해보자.
26 26 typedef struct _IMAGE_IMPORT_DESCRIPTOR { union { DWORD Characteristics; DWORD OriginalFirstThunk; // INT Address (RVA) } DUMMYUNIONNAME; DWORD TimeDateStamp; DWORD ForwarderChain; DWORD Name; DWORD FirstThunk; // IAT Address (RVA) } IMAGE_IMPORT_DESCRIPTOR,*PIMAGE_IMPORT_DESCRIPTOR; 그림 29. IMAGE_IMPORT_DESCRIPTOR 구조체 우선첫번째필드인 Characteristics 필드는더이상사용하지않고 OriginalFirstThunk 라는이름 의필드로사용한다. OriginalFirstThunk 필드는 INT(Import Name Table) 의 RVA 주소값을가지고 있다. 그다음 TimeDataStamp 는시간과날짜를나타내며, 바인딩되지않을경우항상 0 이다. ForwarderChain 필드는바인딩여부와관계되는필드로바인딩되지않은이미지의경우 0 이며 바인딩된경우이값은 0 이아니다. Name 필드는 import 된 DLL 의이름이존재하는 RVA 값을가 진다. 마지막으로 FirstThunk 필드는 IAT(Import Address Table) 의 RVA 주소값을가지고있다. 이러한구조는로드하는 DLL 의수만큼존재하며맨마지막에는 NULL 로채워진해당구조체가존 재하므로배열의끝을알려준다. IMAGE_IMPORT_DESCRIPTOR 의필드항목을통해알수있는 INT 와 IAT 의값을확인해보자. 배열이름 오프셋 데이터 값 0x00000A3C 0x C GetDriveTypeA 0x00000A40 0x C ExitProcess Import Name Table 0x00000A44 0x KERNEL32.DLL 0x00000A48 0x A MessageBoxA 0x00000A4C 0x USER32.DLL 0x00000A50 0x C GetDriveTypeA 0x00000A54 0x C ExitProcess Import Address Table 0x00000A58 0x KERNEL32.DLL 0x00000A5C 0x A MessageBoxA 0x00000A60 0x USER32.DLL 그림 30. INT와 IAT 여기서 INT와 IAT가동일한값을가리킨다는것을알수있다. 하지만메모리에올라오면서 PE 로더가 IAT엔실제함수의명령어위치를채워주게되며, INT에는파일에서와마찬가지로임포트 하는함수의이름을가리키고있다. 그렇다면메모리에서 IAT 기록되어있는함수의주소는어떻 게얻어오는것일까? 크게네단계로나눌수가있다. 아래의그림을보자.
27 27 그림 31. IAT에함수주소기록과정우선로더는 A.EXE 파일이필요로하는 DLL을로드하고자한다. 이를위해 Import 섹션의존재하고있는 IMAGE_IMPORT_DESCRIPTOR(IID) 를통해어떠한 DLL을필요로하는지이름을얻는다. 그리고해당 DLL들을 LoadLibrary API를통해메모리에올리고자한다. 해당 DLL을찾은프로세스는 DLL을매핑하기위한공간을확보한다음 ImageBase에지정된주소로매핑을시도하며, 만약해당주소에매핑하지못한경우재배치를하여다른주소에매핑을한다. 매핑이되었다면로더는 IID의 OriginalFirstThunk 필드를통해 INT에존재하고있는함수에대한정보를얻어온다. 그다음으로로더는해당함수들의함수포인터즉, 함수의시작주소를얻고자획득하고자한다. 로더는 dll의 Export 섹션에서 IMAGE_EXPORT_DIRECTORY 구조체를참고하여 AddessOfName 멤버를통해해당함수의이름을비교하여원하는함수의이름을찾는다. 이때몇번째인덱스에존재하는지확인을한다음 AddressOfNameOrdinals 필드를참조한다. Ordinal 배열에서해당인덱스번호에맞는값을찾은뒤, AddressOfFunctions 멤버를이용해 EAT에서해당인덱스번호에맞는함수의시작주소 (RVA) 를얻는다. 마지막으로해당함수의포인터를획득한다음로더는중요한과정을수행하게되는데, 바로위과정을통해얻은함수의포인터 ( 함수의시작주소 ) 를저장하는것이다. IID의 FirstThunk 필드값을통해 IAT의주소를얻을수가있고, 첫번째과정에서읽은것과같은함수에세번째과정에서얻은함수의시작주소를기록하게된다. 이러한과정을통해파일에서 IAT는 INT와같은곳을가리키지만, 메모리에서는 INT와는전혀다른실제함수의시작위치를가리키고있게된다. 다시말해, IAT는 PE 파일이미지로존재할때와실제로프로세스주소공간내로매핑되었을때의내용이달라진다. DLL 바인딩을할경우
28 28 DLL 을로딩하기전에, IAT 에실제함수의주소를고정시켜버리게되어프로그램이실행될때마다 이러한과정을거치지않게된다. (5) Relocation Section 앞서논의한바와같이로더는실행파일을로드할때지정된 ImageBase 에실행파일이미지를 로드하고자한다. 하지만해당주소에이미다른실행파일이미지가로드되어있는경우중첩되 어그주소를사용할수는없다. 이런경우로더는매핑가능한다른주소를찾아해당주소에 로드해야한다. 대부분의 DLL 은 0x 영역이기본 ImageBase 로처음에로드되는 DLL 의경 우상관없지만두번째부터는다른주소를사용해야만한다. 로딩주소가바뀌게되면절대주소를사용한것은반드시바뀐주소에해당하는값으로고쳐주 어야한다. 그렇지않으면 0x 에로딩된다른 DLL 의메모리영역을참조하게된다. PE 에 서는이렇게고쳐주어야하는곳을재배치섹션에모아서저장해두고있다. 재배치섹션의구 조를한번살펴보자. typedef struct _IMAGE_BASE_RELOCATION { DWORD VirtualAddress; DWORD SizeOfBlock; /* WORD TypeOffset[1]; */ // 이후에해당배열이뒤에따라옴을알려줌 } IMAGE_BASE_RELOCATION,*PIMAGE_BASE_RELOCATION; 그림 32. IMAGE_BASE_RELOCATION 구조체 기준재배치섹션은단순한구조를가지고있다. VirtualAddress 필드는기준재배치가시작되어야 할메모리상의번지에대한 RVA 이다. 실제갱신할위치의표현은 기준 RVA+ 재배치 Offset 으로 구성되고이때기준 RVA 에해당하는것이이필드의값이다. 재배치섹션내의재배치블록은 4K 단위의구조체를포함하는블록이존재하기에나뉘어지는데, 이때 SizeOfBlock 필드의값은 자신을포함하고있는구조체의크기를말한다. 이뒤에는재배치가적용되어야할대상에해당하는가상주소에대한정보를담은 WORD 타입 의배열이온다. 해당배열의각엔트리는두필드로구성되는데하나는재배치타입이며, 다른 하나는재배치오프셋이다. Bit WORD 재배치타입재배치오프셋 그림 33. TypeOffset 엔트리구조 재배치타입의경우거의큰의미가없는값으로 Win32 PE 의경우 3, Win64 의경우 10 이된다. 가끔재배치그룹의마지막엔트리에이필드의값이 0 인경우가있는데이는해당구조체가 4 바이트단위로정렬되기때문에이것을맞추어주기위한패딩으로사용될뿐이다.
29 29 다음으로재배치오프셋은재배치할대상의번지값에대한오프셋이다. 오프셋의기준은위에서 언급하였던 IMAGE_BASE_RELOCATION 구조체의 VirtualAddress 필드의값이된다. 따라서실제로 갱신되어야할위치의 RVA는 VirtualAddress 필드값에재배치오프셋값을더한결과가된다. 재배치오프셋이 12 Bit 밖에되지않아기준이되는 VirtualAddress로부터 4095만큼까지만접근 이가능하다. 그렇다면그이상으로떨어진지점은어떻게표현할까? 새로 VirtualAddress를지정 해주면된다. 즉하나이상의 VirtualAddress 필드가존재할수있으며이에따라각배열이뒤에 붙게된다. 재배치는다음의과정으로이루어진다. 만약 ImageBase의값과실제로드될주소가다른경우그 값의차이인델타값을구한다. 예로원래는 0x 에로드될 a.dll이 0x 에로드되 었다면델타값은 0x 이된다. 그다음아래와같은재배치섹션을확인해보자. pfile Data Description 0x000C1A00 0x VirtualAddress 0x000C1A04 0x C SizeOfBlock 0x000C1A08 0x3E15 TypeOffset[0] 0x000C1A0A 0x3E41 TypeOffset[1] 그림 34. a.dll의재배치섹션 VirtualAddress 필드값이 0x10000인것을확인할수있다. 해당섹션은.text 섹션으로 TypeOffset를따라가보자. 해당 RVA 0x10000의 RAW는 0x600으로재배치오프셋인 0xE15과 0xE41를각각더하면 TypeOffset[0] 이나타내는파일에서의주소는 0x1215와 0x1241이된다. 해 당값을확인해보자 : 1C B E4 6D 57 8B F6 0F.SV.5...}W.x : 85 0A E8 B B 40 2C 64 8B 0D...@,d : A 44 5B B FF FF...jD[SP.A0.p : 15 E4 05 D7 6D 8B F0 33 C0 3B F0 0F 84 5D }..3.;...].. 그림 35. 재배치해야할주소확인 이위치에있는것이무엇을뜻하는지어셈블리어로확인해보자. 첫번째 TypeOffset[0] 은 MOV 명령어의오퍼랜드로사용되고두번째 TypeOffset[1] 은 CALL 명령어에사용되는것을확인할수 있다 B E47D MOV ESI,DWORD PTR DS:[6DE40318] (skip) AF FF15 E405D77D CALL DWORD PTR DS:[6DD705E4] 그림 36. 재배치할주소의명령어 재배치해야할값을찾았으니이제이값에위에서구한델타값 0x 을각각더해주게
30 30 된다. 따라서 0x1215에있는값은 0x 에매핑된이후 [0x6DE x ] 이되며, 0x1241에있는값은매핑된이후 [0x6DD705E4+0x ] 이된다. 이와같이재배치섹션은어떠한값을바꾸어야하는지알려주는역할을한다. 하지만기준재배치를수행해야할상황이되었을때발생할수있는문제점또한존재한다. 크게두가지문제점이있는데첫째로, 로더는재배치섹션을스캔하면서재배치섹션내에존재하는각오프셋이가리키는위치의해당모듈의코드를모두수정해야한다. 이것은응용프로그램의초기화시간을더늘어나게만든다. 둘째로, 로더가재배치섹션의엔트리가지시하는해당번지값을수정할때발생하는문제가있다. 갱신되어야할해당주소공간의번지값은.text 섹션에존재하는데, 코드섹션의경우 Write 속성이없기때문에결국번지값을수정하기위해섹션의속성을변경해야만한다.
31 31 7. API Hooking 위과정에서본것과같이 IAT는읽을수있을뿐만아니라쓰기속성을가지고있다. 따라서이러한속성을이용해기존의 API에대한호출을자신이정의한 API로향하도록변경할수있다. 이를 API 후킹이라한다. 이번장에서는 DLL 인젝션을진행하는방법과 IAT 후킹에대하여알아보자. (1) DLL Injection 몇가지인젝션방법중세가지방법에대하여알아보자. 우선 DLL 인젝셕은다른프로세스에게강제로 DLL을로딩시키도록하는것으로, 원하는기능을수행하는 DLL을다른프로세스에매핑시켜원하는동작을수행하도록한다. 여러방법중우선 CreateRemoteThread API를이용하는방법에대하여알아보자. 흔히 DLL을자신의프로세스에로드하기위해서는 LoadLibrary API를사용한다. 하지만다른프로세스에게 LoadLibrary API를사용하여 DLL을로드시킬수가없으므로 CreateRemoteThread API 를통해다른프로세스에게스레드를실행시키도록하여 DLL을로드시킬수있다. HANDLE WINAPI CreateRemoteThread( _In_ HANDLE hprocess, // 프로세스핸들 _In_ LPSECURITY_ATTRIBUTES lpthreadattributes, _In_ SIZE_T dwstacksize, _In_ LPTHREAD_START_ROUTINE lpstartaddress, // 스레드함수주소 _In_ LPVOID lpparameter, // 스레드파라미터주소 _In_ DWORD dwcreationflags, _Out_ LPDWORD lpthreadid ); 그림 37. CreateRemoteThread API 위에는 CreateRemoteThread API의인자로어떠한것이있는지나타내는것으로중요한항목은바로네번째인자인 lpstartaddress이다. 해당파라미터는스레드가수행할함수의주소를넘겨주는것으로다른프로세스에서수행할함수의주소를말한다. 바로여기에 LoadLibrary API의주소를주고, 다섯번째인자에로드시키고자하는 DLL의이름을넘겨주면된다. 다음으로레지스트리를통해쉽게 DLL Injection하는방법에대하여알아보자. 바로 AppInit_DLLs 라는레지스트리키로여기에인젝션하고자하는 DLL의경로를기입해준뒤재부팅을시행하면, 재부팅하면서실행되는모든프로세스에해당 DLL을인젝션시켜준다. 위 CreateRemoteThread가하나의프로세스를지정해주는것과는다르게모든프로세스에시행된다는점이차이난다고할수있다. 해당경로는다음과같다. HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\AppInit_DLLs
32 32 그림 38. AppInit_DLLs Registry Key 마지막으로알아본 DLL 인젝션방법은윈도우운영체제가제공하는 API를사용하는방법이다. 윈도우운영체제는사용자에게 GUI를제공해주고, 사용자는제공받은 GUI를이용하여원하는동작을수행할수있다. 동작을수행하는데있어마우스나키보드와관련된동작을수행하게되는데이러한동작은윈도우운영체제가 Event Driven 방식으로처리한다. 다시말해이러한동작을이벤트로발생시켜운영체제가그이벤트에맞는메시지를해당응용프로그램에게전달하여처리하는방식이다. 아래그림을보면메시지후킹이어떤지점에서이루어지는지볼수있다. 사용자가어떠한행위를했을때이벤트가발생되고, 이벤트발생으로인해 OS에서응용프로그램으로보낼메시지들이 OS Message Queue에추가된다. 운영체제는해당이벤트가어떤응용프로그램에서발생했는지파악한다음, OS 큐에서메시지를꺼내해당응용프로그램의메시지큐에전달한다. 해당응용프로그램은자신의응용프로그램메시지큐에해당메시지가추가된것을확인하고해당이벤트핸들러를호출한다. 이러한방식으로윈도우는메시지를전달한다. 그림 39. 메시지전달방식 윈도우운영체제어서는이러한메시지를후킹하기위한 API 인 SetWindowsHookEx() 를기본적으로 제공한다. 이 API 는훅체인에응용프로그램이정의한후크프로시저를설치하며이를통해사 용자는특정유형의이벤트를모니터링할수있다. HHOOK WINAPI SetWindowsHookEx( _In_ int idhook // 훅종류 _In_ HOOKPROC lpfn, // 지정한이벤트발생시처리하는프로시저주소 _In_ HINSTANCE hmod, // lpfn 이있는 DLL 의핸들 _In_ DWORD dwthreadid ); 그림 40. SetWindowsHookEx API 만약해당 API 를구현하는 HookKey.dll 이존재하며이를실행하기위한 HookMain.exe 를제작하
33 33 였다고가정하자. HookMain.exe 를실행하면 HookKey.dll 이해당프로세스의메모리에로드되며 SetWindowsHookEx() 가호출된다. 이렇게메시지후킹이걸린상테에서, 다른프로세스가해당이 벤트를발생시킨다면 HookKey.dll 은그프로세스에서도로딩된다. 그림 41. SetWindowsHookEx 를이용한후킹 이러한방법들을통해원하는 DLL 을프로세스에인젝션할수있다. (2) IAT Hooking IAT는위에서자세히설명한바와같이 Import Address Table로, 메모리에매핑되면서 PE 로더가 IAT에실제함수의주소를기록해준다. 다시말해파일에서의 IAT는실제함수의주소를가리키고있는것이아니며일반적으로 INT와같은곳을가리키고있다. 하지만메모리에올라온뒤에는해당프로그램이사용하고자하는함수의주소가기록되어있다. IAT 후킹은바로이 IAT에기록되어있는주소를바꿔원하는함수의주소로가도록하는것이다. 이를통해다양한파라미터나리턴값을조작하는등의작업을수행할수있다. 그렇다면일반적으로 API가호출되는상황에대하여먼저알아보자 A. 68 E PUSH 3E8 ; /Timeout = ms F. FF15 68B14300 CALL DWORD PTR DS:[43B168] ; Sleep() API 0043B168 > FF A F v.4viQ4v/D4v FF > 8BFF MOV EDI,EDI PUSH EBP BEC MOV EBP,ESP (skip) 그림 42. 일반적인 API 호출과정 위예에서 Sleep API를호출하고자할때바로 CALL 명령어를통해 FF(Sleep함수 ) 를호출
34 34 하는것이아니라 DS:[43B168] 을참조해해당주소에있는 FF라는주소를얻어이를호출한다. 그렇다면왜바로 CALL FF라하지않을까? 이는 DLL의특성상운영체제버전이나언어, 서비스팩에따라 DLL의버전이다르며해당함수의위치가달라지기때문에 IAT에매핑된주소를참조하여함수를호출하도록하는것이다. 바로 43B168가 IAT의한부분으로 Sleep 함수의실제주소가메모리에올라오면서기록된것이다. 따라서 IAT를후킹한다는것, 좀더구체적으로 IAT에서 Sleep() 을후킹하는것은바로해당 API의실제주소를가지고있는 IAT의주소 (43B168) 에위치한주소값을바꾸는것이다. 후킹된모습은다음과같다 A. 68 E PUSH 3E8 ; /Timeout = ms F. FF15 68B14300 CALL DWORD PTR DS:[43B168] ; Sleep() API 0043B168 > A F v.4viQ4v/D4v ADD DWORD PTR SS:[ESP+4],1000 ; 인자값변조 E9 D200F475 JMP FF ; Kernel32.Sleep() FF > 8BFF MOV EDI,EDI PUSH EBP BEC MOV EBP,ESP (skip) 그림 43. 후킹된 API 호출과정 이전과똑같이 Sleep() 을호출하기위해 IAT를참조하게된다. 하지만해당 IAT는후킹되어기존의 Sleep() 함수의주소가아닌, 후킹함수의주소 (0x401020) 를가리키고있다. 결국프로세스는 Sleep() 을호출했지만후킹된주소로넘어가게되며, 후킹된주소에서파라미터를변조한후원래 의 Sleep() 함수로진입하게된다. 이와같은 IAT 후킹은간단하게이루어지면서도해당프로세스에서후킹한함수를호출할때마다 후킹함수를지나가게되므로강력하다고할수있다.
목 차 1. 개요 2. PE(Portable Executable) 이란? 3. IMAGE_DOS_HEADER 4. IMAGE_NT_HEADER 1) IMAGE_FILE_HEADER 2) IMAGE_OPTIONAL_HEADER 3) IMAGE_DATA_DIRECTORY
작성자 : 한서대학교 H.I.S.L 동아리진선호 sunho104@msn.com 본보고서의전부나일부를인용시반드시 [ 자료 : 한서대학교정보보호동아리 (H.I.S.L)] 를명시하여주시기바랍니다. - 1 - 목 차 1. 개요 2. PE(Portable Executable) 이란? 3. IMAGE_DOS_HEADER 4. IMAGE_NT_HEADER 1) IMAGE_FILE_HEADER
More informationDeok9_PE Structure
PE Structure CodeEngn Co-Administrator!!! and Team Sur3x5F Member Nick : Deok9 E-mail : DDeok9@gmail.com HomePage : http://deok9.sur3x5f.org Twitter :@DDeok9 1. PE > 1) PE? 2) PE 3) PE Utility
More information<4D F736F F D20B0ADB5BFC7F65FB1E2BCFAB9AEBCAD5F4645B1B8C1B620B1E2BCFAB9AEBCAD5F66726F6D E6B5F66696E F2E646F63>
기술문서 08.10.24. 작성 PE 구조분석 Windows 계열 OS 의파일구성 (PE: Portable Executable) 작성자 : 동명대학교 THINK 강동현 (cari2052@gmail.com) 0. 시작하면서 -------------------------------------------------------------------------- p.02
More information목차 ⓵ VA and RVA 4p. ⓶ RVA to RAW 5p. ⓷ PE 7p. PE의개념. PE Header가생기는과정. PE의필요성. ⓷ DOS Header 8p. e_magic e_lfanew ⓸ DOS Stub 9p. 1
PE 구조 keybreak4855@tistory.com http://keybreak.tistory.com 목차 ⓵ VA and RVA 4p. ⓶ RVA to RAW 5p. ⓷ PE 7p. PE의개념. PE Header가생기는과정. PE의필요성. ⓷ DOS Header 8p. e_magic e_lfanew ⓸ DOS Stub 9p. 1 ⓹ NT Header 10p.
More informationMicrosoft Word - PE_structure.docx
PE의구조 < 밑의내용은 kkamagui 님이쓰신글과 Msdn Magazine 의 An In-Depth Look into the Win32 Portable Executable File Format Part I, II와 msdn의 Debugging and Error Handling Technical Articles 에기재된 Peering Inside the PE:
More information연재순서 실행파읷속으로 필자소개 싞영짂 웰비아닶컴에서보안프로그래머로읷하고있다. 시스템프로그래밍에관심이많으며다수의 PC 보안프로그램개발에참여했다. 현재데브피아 Visual C++ 섹션시
윈도우프로그래머를위한 PE 포맷가이드 실행파읷속으로 목차 목차... 1 License... 1 소개... 1 연재가이드... 1 연재순서... 2 필자소개... 2 필자메모... 2 Introduction... 2 PE 포맷의젂체적읶구조... 3 DOS 헤더및스텁코드... 5 NT 헤더... 5 섹션헤더... 7 RVA와파읷오프셋... 10 익스포트정보...
More information< C6520B1B8C1B6BFCD20BEF0C6D0C5B7C0C720BFF8B8AE2E687770>
PE FILE 구조와 언패킹의원리 지선호 kissmefox@gmail.com - 1 - < PE FILE 이란 > -win32 운영체제에서이용되는파일형식 ( 현재사용되는대부분의 OS) -Portable executable, : exe, dll, ocx 이식가능한실행파일형식 - 윈도우의바이너리를분석하기위한가장기본이되는지식 : unpacking, API Hooking,
More informationMicrosoft PowerPoint - chap02-C프로그램시작하기.pptx
#include int main(void) { int num; printf( Please enter an integer "); scanf("%d", &num); if ( num < 0 ) printf("is negative.\n"); printf("num = %d\n", num); return 0; } 1 학습목표 을 작성하면서 C 프로그램의
More informationPowerPoint 프레젠테이션
System Software Experiment 1 Lecture 5 - Array Spring 2019 Hwansoo Han (hhan@skku.edu) Advanced Research on Compilers and Systems, ARCS LAB Sungkyunkwan University http://arcs.skku.edu/ 1 배열 (Array) 동일한타입의데이터가여러개저장되어있는저장장소
More information슬라이드 1
-Part3- 제 4 장동적메모리할당과가변인 자 학습목차 4.1 동적메모리할당 4.1 동적메모리할당 4.1 동적메모리할당 배울내용 1 프로세스의메모리공간 2 동적메모리할당의필요성 4.1 동적메모리할당 (1/6) 프로세스의메모리구조 코드영역 : 프로그램실행코드, 함수들이저장되는영역 스택영역 : 매개변수, 지역변수, 중괄호 ( 블록 ) 내부에정의된변수들이저장되는영역
More informationMicrosoft PowerPoint - chap01-C언어개요.pptx
#include int main(void) { int num; printf( Please enter an integer: "); scanf("%d", &num); if ( num < 0 ) printf("is negative.\n"); printf("num = %d\n", num); return 0; } 1 학습목표 프로그래밍의 기본 개념을
More information<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>
연습문제해답 5 4 3 2 1 0 함수의반환값 =15 5 4 3 2 1 0 함수의반환값 =95 10 7 4 1-2 함수의반환값 =3 1 2 3 4 5 연습문제해답 1. C 언어에서의배열에대하여다음중맞는것은? (1) 3차원이상의배열은불가능하다. (2) 배열의이름은포인터와같은역할을한다. (3) 배열의인덱스는 1에서부터시작한다. (4) 선언한다음, 실행도중에배열의크기를변경하는것이가능하다.
More informationContent 1. DLL? 그게뭐야?
DLL Injection 은어떻게이루어지는가? By bl4ck3y3 (http://hisjournal.net/blog) Abstract 루트킷을비롯하여바이러스, 악성코드등여러분야에두루쓰이는기법이 DLL Injection입니다. Windows에한정되어적용되는것이지만, Windows 자체의점유율이높은이유로아주효과적으로공격자가원하는작업을수행할수있는방법이죠. 최근루트킷에대해공부하면서이
More information[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi
2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Function) 1. 함수의개념 입력에대해적절한출력을발생시켜주는것 내가 ( 프로그래머 ) 작성한명령문을연산, 처리, 실행해주는부분 ( 모듈 ) 자체적으로실행되지않으며,
More informationMicrosoft Word - PE Infection ? How to Inject a dll.doc
Black- out Frenzy [ B] (F) Security Researcher Center B0Frenzy.freehostia.com PE Infection How to Inject a dll www.mihanit.net Thank you to my friends who help me in this research (K053,Heli, L U C I F
More informationDLL Injection
DLL Injection REVERSING CreateRemoteThread() 를중점으로 DLL Injection 에대하여설명 [ Rnfwoa] 김경민 목차 목차 1 개요 1 2 DLL ( Dynamic Link Library ) 2 3 AppInit_DLLs 3 4 원격스레드생성 5 4.1 핸들확보 6 4.2 공간할당 7 4.3 DLL Name 기록 8
More informationDeok9_Exploit Technique
Exploit Technique CodeEngn Co-Administrator!!! and Team Sur3x5F Member Nick : Deok9 E-mail : DDeok9@gmail.com HomePage : http://deok9.sur3x5f.org Twitter :@DDeok9 > 1. Shell Code 2. Security
More information금오공대 컴퓨터공학전공 강의자료
C 프로그래밍프로젝트 Chap 14. 포인터와함수에대한이해 2013.10.09. 오병우 컴퓨터공학과 14-1 함수의인자로배열전달 기본적인인자의전달방식 값의복사에의한전달 val 10 a 10 11 Department of Computer Engineering 2 14-1 함수의인자로배열전달 배열의함수인자전달방식 배열이름 ( 배열주소, 포인터 ) 에의한전달 #include
More information임베디드시스템설계강의자료 6 system call 2/2 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과
임베디드시스템설계강의자료 6 system call 2/2 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과 System call table and linkage v Ref. http://www.ibm.com/developerworks/linux/library/l-system-calls/ - 2 - Young-Jin Kim SYSCALL_DEFINE 함수
More informationMicrosoft PowerPoint - chap06-2pointer.ppt
2010-1 학기프로그래밍입문 (1) chapter 06-2 참고자료 포인터 박종혁 Tel: 970-6702 Email: jhpark1@snut.ac.kr 한빛미디어 출처 : 뇌를자극하는 C프로그래밍, 한빛미디어 -1- 포인터의정의와사용 변수를선언하는것은메모리에기억공간을할당하는것이며할당된이후에는변수명으로그기억공간을사용한다. 할당된기억공간을사용하는방법에는변수명외에메모리의실제주소값을사용하는것이다.
More informationuntitled
시스템소프트웨어 : 운영체제, 컴파일러, 어셈블러, 링커, 로더, 프로그래밍도구등 소프트웨어 응용소프트웨어 : 워드프로세서, 스프레드쉬트, 그래픽프로그램, 미디어재생기등 1 n ( x + x +... + ) 1 2 x n 00001111 10111111 01000101 11111000 00001111 10111111 01001101 11111000
More informationIntroduce
Windows Hook Jerald Lee Contact Me : lucid7@paran.com 본문서는저자가 Windows Hook을공부하면서알게된것들을정리할목적으로작성되었습니다. 본인이 Windows System에대해아는것의거의없기때문에기존에존재하는문서들을짜집기한형태의문서로밖에만들수가없었습니다. 문서를만들면서참고한책, 관련문서등이너무많아일일이다기술하지못한점에대해원문저자들에게매우죄송스럽게생각합니다.
More informationJVM 메모리구조
조명이정도면괜찮조! 주제 JVM 메모리구조 설미라자료조사, 자료작성, PPT 작성, 보고서작성. 발표. 조장. 최지성자료조사, 자료작성, PPT 작성, 보고서작성. 발표. 조원 이용열자료조사, 자료작성, PPT 작성, 보고서작성. 이윤경 자료조사, 자료작성, PPT작성, 보고서작성. 이수은 자료조사, 자료작성, PPT작성, 보고서작성. 발표일 2013. 05.
More information11장 포인터
누구나즐기는 C 언어콘서트 제 9 장포인터 이번장에서학습할내용 포인터이란? 변수의주소 포인터의선언 간접참조연산자 포인터연산 포인터와배열 포인터와함수 이번장에서는포인터의기초적인지식을학습한다. 포인터란? 포인터 (pointer): 주소를가지고있는변수 메모리의구조 변수는메모리에저장된다. 메모리는바이트단위로액세스된다. 첫번째바이트의주소는 0, 두번째바이트는 1, 변수와메모리
More information금오공대 컴퓨터공학전공 강의자료
C 프로그래밍프로젝트 Chap 13. 포인터와배열! 함께이해하기 2013.10.02. 오병우 컴퓨터공학과 13-1 포인터와배열의관계 Programming in C, 정재은저, 사이텍미디어. 9 장참조 ( 교재의 13-1 은읽지말것 ) 배열이름의정체 배열이름은 Compile 시의 Symbol 로서첫번째요소의주소값을나타낸다. Symbol 로서컴파일시에만유효함 실행시에는메모리에잡히지않음
More informationA Hierarchical Approach to Interactive Motion Editing for Human-like Figures
단일연결리스트 (Singly Linked List) 신찬수 연결리스트 (linked list)? tail 서울부산수원용인 null item next 구조체복습 struct name_card { char name[20]; int date; } struct name_card a; // 구조체변수 a 선언 a.name 또는 a.date // 구조체 a의멤버접근 struct
More informationchap 5: Trees
5. Threaded Binary Tree 기본개념 n 개의노드를갖는이진트리에는 2n 개의링크가존재 2n 개의링크중에 n + 1 개의링크값은 null Null 링크를다른노드에대한포인터로대체 Threads Thread 의이용 ptr left_child = NULL 일경우, ptr left_child 를 ptr 의 inorder predecessor 를가리키도록변경
More informationChapter #01 Subject
Device Driver March 24, 2004 Kim, ki-hyeon 목차 1. 인터럽트처리복습 1. 인터럽트복습 입력검출방법 인터럽트방식, 폴링 (polling) 방식 인터럽트서비스등록함수 ( 커널에등록 ) int request_irq(unsigned int irq, void(*handler)(int,void*,struct pt_regs*), unsigned
More informationAPI 매뉴얼
PCI-DIO12 API Programming (Rev 1.0) Windows, Windows2000, Windows NT and Windows XP are trademarks of Microsoft. We acknowledge that the trademarks or service names of all other organizations mentioned
More informationA Dynamic Grid Services Deployment Mechanism for On-Demand Resource Provisioning
C Programming Practice (II) Contents 배열 문자와문자열 구조체 포인터와메모리관리 구조체 2/17 배열 (Array) (1/2) 배열 동일한자료형을가지고있으며같은이름으로참조되는변수들의집합 배열의크기는반드시상수이어야한다. type var_name[size]; 예 ) int myarray[5] 배열의원소는원소의번호를 0 부터시작하는색인을사용
More informationMicrosoft PowerPoint - ch07 - 포인터 pm0415
2015-1 프로그래밍언어 7. 포인터 (Pointer), 동적메모리할당 2015 년 4 월 4 일 교수김영탁 영남대학교공과대학정보통신공학과 (Tel : +82-53-810-2497; Fax : +82-53-810-4742 http://antl.yu.ac.kr/; E-mail : ytkim@yu.ac.kr) Outline 포인터 (pointer) 란? 간접참조연산자
More information11장 포인터
Dynamic Memory and Linked List 1 동적할당메모리의개념 프로그램이메모리를할당받는방법 정적 (static) 동적 (dynamic) 정적메모리할당 프로그램이시작되기전에미리정해진크기의메모리를할당받는것 메모리의크기는프로그램이시작하기전에결정 int i, j; int buffer[80]; char name[] = data structure"; 처음에결정된크기보다더큰입력이들어온다면처리하지못함
More informationC# Programming Guide - Types
C# Programming Guide - Types 최도경 lifeisforu@wemade.com 이문서는 MSDN 의 Types 를요약하고보충한것입니다. http://msdn.microsoft.com/enus/library/ms173104(v=vs.100).aspx Types, Variables, and Values C# 은 type 에민감한언어이다. 모든
More informationMicrosoft PowerPoint - a10.ppt [호환 모드]
Structure Chapter 10: Structures t and Macros Structure 관련된변수들의그룹으로이루어진자료구조 template, pattern field structure를구성하는변수 (cf) C언어의 struct 프로그램의 structure 접근 entire structure 또는 individual fields Structure는
More informationMicrosoft Word - FunctionCall
Function all Mechanism /* Simple Program */ #define get_int() IN KEYOARD #define put_int(val) LD A val \ OUT MONITOR int add_two(int a, int b) { int tmp; tmp = a+b; return tmp; } local auto variable stack
More information설계란 무엇인가?
금오공과대학교 C++ 프로그래밍 jhhwang@kumoh.ac.kr 컴퓨터공학과 황준하 5 강. 배열, 포인터, 참조목차 배열 포인터 C++ 메모리구조 주소연산자 포인터 포인터연산 배열과포인터 메모리동적할당 문자열 참조 1 /20 5 강. 배열, 포인터, 참조배열 배열 같은타입의변수여러개를하나의변수명으로처리 int Ary[10]; 총 10 개의변수 : Ary[0]~Ary[9]
More informationChapter 4. LISTS
C 언어에서리스트구현 리스트의생성 struct node { int data; struct node *link; ; struct node *ptr = NULL; ptr = (struct node *) malloc(sizeof(struct node)); Self-referential structure NULL: defined in stdio.h(k&r C) or
More information학습목차 2.1 다차원배열이란 차원배열의주소와값의참조
- Part2- 제 2 장다차원배열이란무엇인가 학습목차 2.1 다차원배열이란 2. 2 2 차원배열의주소와값의참조 2.1 다차원배열이란 2.1 다차원배열이란 (1/14) 다차원배열 : 2 차원이상의배열을의미 1 차원배열과다차원배열의비교 1 차원배열 int array [12] 행 2 차원배열 int array [4][3] 행 열 3 차원배열 int array [2][2][3]
More information<4D F736F F F696E74202D203137C0E55FBFACBDC0B9AEC1A6BCD6B7E7BCC72E707074>
SIMATIC S7 Siemens AG 2004. All rights reserved. Date: 22.03.2006 File: PRO1_17E.1 차례... 2 심벌리스트... 3 Ch3 Ex2: 프로젝트생성...... 4 Ch3 Ex3: S7 프로그램삽입... 5 Ch3 Ex4: 표준라이브러리에서블록복사... 6 Ch4 Ex1: 실제구성을 PG 로업로드하고이름변경......
More informationPowerPoint Presentation
FORENSICINSIGHT SEMINAR SQLite Recovery zurum herosdfrc@google.co.kr Contents 1. SQLite! 2. SQLite 구조 3. 레코드의삭제 4. 삭제된영역추적 5. 레코드복원기법 forensicinsight.org Page 2 / 22 SQLite! - What is.. - and why? forensicinsight.org
More information개요 1. 후킹이란? 후킹의정의.. 2 후킹의종류 2 앞으로 후킹프로그램을위한사전지식들 Window 에서 data 입력과정.. 3 DLL ( Dynamic Link Library ).. 4 메시지후킹을위해필요한지식들 5 3. 후킹프로그램제작에필요한 API
개요 1. 후킹이란? 후킹의정의.. 2 후킹의종류 2 앞으로...2 2. 후킹프로그램을위한사전지식들 Window 에서 data 입력과정.. 3 DLL ( Dynamic Link Library ).. 4 메시지후킹을위해필요한지식들 5 3. 후킹프로그램제작에필요한 API 함수소개 SetWindowsHookEx 함수 5 UnhookWindowsHookEx 함수 5
More informationMicrosoft PowerPoint - ch09 - 연결형리스트, Stack, Queue와 응용 pm0100
2015-1 프로그래밍언어 9. 연결형리스트, Stack, Queue 2015 년 5 월 4 일 교수김영탁 영남대학교공과대학정보통신공학과 (Tel : +82-53-810-2497; Fax : +82-53-810-4742 http://antl.yu.ac.kr/; E-mail : ytkim@yu.ac.kr) 연결리스트 (Linked List) 연결리스트연산 Stack
More informationSecure Programming Lecture1 : Introduction
Malware and Vulnerability Analysis Lecture1 Malware Analysis #1 Agenda 악성코드정적분석 악성코드분석 악성코드정적분석 정적분석 임의의코드또는응용프로그램을실행하지않고분석 ASCII 문자열 (ex. URL) API 리스트 Packing VT 기타등등 정적분석 : 파일식별 악성으로의심되는파일의형태식별 file
More informationMicrosoft PowerPoint - chap06-1Array.ppt
2010-1 학기프로그래밍입문 (1) chapter 06-1 참고자료 배열 박종혁 Tel: 970-6702 Email: jhpark1@snut.ac.kr 한빛미디어 출처 : 뇌를자극하는 C프로그래밍, 한빛미디어 -1- 배열의선언과사용 같은형태의자료형이많이필요할때배열을사용하면효과적이다. 배열의선언 배열의사용 배열과반복문 배열의초기화 유연성있게배열다루기 한빛미디어
More informationMicrosoft PowerPoint - e pptx
Import/Export Data Using VBA Objectives Referencing Excel Cells in VBA Importing Data from Excel to VBA Using VBA to Modify Contents of Cells 새서브프로시저작성하기 프로시저실행하고결과확인하기 VBA 코드이해하기 Referencing Excel Cells
More informationMicrosoft Word - 과목1.Reverse Engineering.doc
Table of Content Module 1 RCE 란?...1 1-1. RCE 란?...2 1-2. RCE 관련법규...4 1-3. RCE 응용분야...6 Module 2 RCE 기초...9 2-1. CPU 동작방식...10 2-2. CPU 레지스터...12 2-3. Assembly...17 2-4. STACK 구조...21 2-5. 함수호출규약 (Calling
More information설계란 무엇인가?
금오공과대학교 C++ 프로그래밍 jhhwang@kumoh.ac.kr 컴퓨터공학과 황준하 6 강. 함수와배열, 포인터, 참조목차 함수와포인터 주소값의매개변수전달 주소의반환 함수와배열 배열의매개변수전달 함수와참조 참조에의한매개변수전달 참조의반환 프로그래밍연습 1 /15 6 강. 함수와배열, 포인터, 참조함수와포인터 C++ 매개변수전달방법 값에의한전달 : 변수값,
More information<4D F736F F F696E74202D20B8B6C0CCC5A9B7CEC7C1B7CEBCBCBCAD202839C1D6C2F7207E203135C1D6C2F >
10주차 문자 LCD 의인터페이스회로및구동함수 Next-Generation Networks Lab. 5. 16x2 CLCD 모듈 (HY-1602H-803) 그림 11-18 19 핀설명표 11-11 번호 분류 핀이름 레벨 (V) 기능 1 V SS or GND 0 GND 전원 2 V Power DD or V CC +5 CLCD 구동전원 3 V 0 - CLCD 명암조절
More informationMicrosoft PowerPoint - chap10-함수의활용.pptx
#include int main(void) { int num; printf( Please enter an integer: "); scanf("%d", &num); if ( num < 0 ) printf("is negative.\n"); printf("num = %d\n", num); return 0; } 1 학습목표 중 값에 의한 전달 방법과
More informationPowerPoint 프레젠테이션
Chapter 10 포인터 01 포인터의기본 02 인자전달방법 03 포인터와배열 04 포인터와문자열 변수의주소를저장하는포인터에대해알아본다. 함수의인자를값과주소로전달하는방법을알아본다. 포인터와배열의관계를알아본다. 포인터와문자열의관계를알아본다. 1.1 포인터선언 포인터선언방법 자료형 * 변수명 ; int * ptr; * 연산자가하나이면 1 차원포인터 1 차원포인터는일반변수의주소를값으로가짐
More informationVisual Basic 반복문
학습목표 반복문 For Next문, For Each Next문 Do Loop문, While End While문 구구단작성기로익히는반복문 2 5.1 반복문 5.2 구구단작성기로익히는반복문 3 반복문 주어진조건이만족하는동안또는주어진조건이만족할때까지일정구간의실행문을반복하기위해사용 For Next For Each Next Do Loop While Wend 4 For
More informationhlogin2
0x02. Stack Corruption off-limit Kernel Stack libc Heap BSS Data Code off-limit Kernel Kernel : OS Stack libc Heap BSS Data Code Stack : libc : Heap : BSS, Data : bss Code : off-limit Kernel Kernel : OS
More informationPowerPoint Template
JavaScript 회원정보 입력양식만들기 HTML & JavaScript Contents 1. Form 객체 2. 일반적인입력양식 3. 선택입력양식 4. 회원정보입력양식만들기 2 Form 객체 Form 객체 입력양식의틀이되는 태그에접근할수있도록지원 Document 객체의하위에위치 속성들은모두 태그의속성들의정보에관련된것
More informationMicrosoft Word - building the win32 shellcode 01.doc
Win32 Attack 1. Local Shellcode 작성방법 By 달고나 (Dalgona@wowhacker.org) Email: zinwon@gmail.com Abstract 이글은 MS Windows 환경에서 shellcode 를작성하는방법에대해서설명하고있다. Win32 는 *nix 환경과는사뭇다른 API 호출방식을사용하기때문에조금복잡하게둘러서 shellcode
More informationAPI 매뉴얼
PCI-TC03 API Programming (Rev 1.0) Windows, Windows2000, Windows NT, Windows XP and Windows 7 are trademarks of Microsoft. We acknowledge that the trademarks or service names of all other organizations
More information17장 클래스와 메소드
17 장클래스와메소드 박창이 서울시립대학교통계학과 박창이 ( 서울시립대학교통계학과 ) 17 장클래스와메소드 1 / 18 학습내용 객체지향특징들객체출력 init 메소드 str 메소드연산자재정의타입기반의버전다형성 (polymorphism) 박창이 ( 서울시립대학교통계학과 ) 17 장클래스와메소드 2 / 18 객체지향특징들 객체지향프로그래밍의특징 프로그램은객체와함수정의로구성되며대부분의계산은객체에대한연산으로표현됨객체의정의는
More information1. 개요 악성코드는여러분류로나누어볼수가있다. 이중일반사용자의입장에서 악성코드 라는단어보다친숙한 바이러스 가있다. 사실필자도보안을공부하기이전에는 악성코드 라는단어는아예들어보지못했고, 대신 바이러스 라는단어로모든악성코드를지칭했었다. 바이러스는악성코드분류의한종류로 스스로를
Malware Analysis Report Mad Angel 2016.09.17 By Kali-KM 1. 개요 악성코드는여러분류로나누어볼수가있다. 이중일반사용자의입장에서 악성코드 라는단어보다친숙한 바이러스 가있다. 사실필자도보안을공부하기이전에는 악성코드 라는단어는아예들어보지못했고, 대신 바이러스 라는단어로모든악성코드를지칭했었다. 바이러스는악성코드분류의한종류로
More informationActFax 4.31 Local Privilege Escalation Exploit
NSHC 2013. 05. 23 악성코드 분석 보고서 [ Ransomware 악성코드 ] 사용자의 컴퓨터를 강제로 잠그고 돈을 요구하는 형태의 공격이 기승을 부리고 있 습니다. 이러한 형태의 공격에 이용되는 악성코드는 Ransomware로 불리는 악성코 드 입니다. 한번 감염 시 치료절차가 복잡하며, 보고서 작성 시점을 기준으로 지속 적인 피해자가 발생되고
More information이번장에서학습할내용 동적메모리란? malloc() 와 calloc() 연결리스트 파일을이용하면보다많은데이터를유용하고지속적으로사용및관리할수있습니다. 2
제 17 장동적메모리와연결리스트 유준범 (JUNBEOM YOO) Ver. 2.0 jbyoo@konkuk.ac.kr http://dslab.konkuk.ac.kr 본강의자료는생능출판사의 PPT 강의자료 를기반으로제작되었습니다. 이번장에서학습할내용 동적메모리란? malloc() 와 calloc() 연결리스트 파일을이용하면보다많은데이터를유용하고지속적으로사용및관리할수있습니다.
More informationMicrosoft PowerPoint - o8.pptx
메모리보호 (Memory Protection) 메모리보호를위해 page table entry에 protection bit와 valid bit 추가 Protection bits read-write / read-only / executable-only 정의 page 단위의 memory protection 제공 Valid bit (or valid-invalid bit)
More information디지털영상처리3
비트맵개요 BMP 파일의이해실제 BMP 파일의분석 BMP 파일을화면에출력 } 비트맵 (bitmap) 윈도우즈에서영상을표현하기위해사용되는윈도우즈 GDI(Graphic Device Interface) 오브젝트의하나 } 벡터그래픽 (vector graphics) 점, 선, 면등의기본적인그리기도구를이용하여그림을그리는방식 } 윈도우즈 GDI(Graphic Device
More informationMicrosoft PowerPoint - chap06-5 [호환 모드]
2011-1 학기프로그래밍입문 (1) chapter 06-5 참고자료 변수의영역과데이터의전달 박종혁 Tel: 970-6702 Email: jhpark1@seoultech.ac.kr h k 한빛미디어 출처 : 뇌를자극하는 C프로그래밍, 한빛미디어 -1- ehanbit.net 자동변수 지금까지하나의함수안에서선언한변수는자동변수이다. 사용범위는하나의함수내부이다. 생존기간은함수가호출되어실행되는동안이다.
More informationPowerPoint Presentation
#include int main(void) { int num; printf( Please enter an integer: "); scanf("%d", &num); if ( num < 0 ) printf("is negative.\n"); printf("num = %d\n", num); return 0; } 1 학습목표 을작성하면서 C 프로그램의구성요소에대하여알아본다.
More information03_queue
Queue Data Structures and Algorithms 목차 큐의이해와 ADT 정의 큐의배열기반구현 큐의연결리스트기반구현 큐의활용 덱 (Deque) 의이해와구현 Data Structures and Algorithms 2 큐의이해와 ADT 정의 Data Structures and Algorithms 3 큐 (Stack) 의이해와 ADT 정의 큐는 LIFO(Last-in,
More informationUI TASK & KEY EVENT
2007. 2. 5 PLATFORM TEAM 정용학 차례 CONTAINER & WIDGET SPECIAL WIDGET 질의응답및토의 2 Container LCD에보여지는화면한개 1개이상의 Widget을가짐 3 Container 초기화과정 ui_init UMP_F_CONTAINERMGR_Initialize UMP_H_CONTAINERMGR_Initialize
More information악성코드분석을위한 실행압축 해제기법 1. 개요 이제목을보고 실행압축이뭐야? 하는이도있을테고, 실행하면자동으로압축이풀리는 ZIP 파일과비슷한거아냐? 하고떠올리는이도있을것이다. 그러나여기서설명하는실행압축은그대상이다르다. 흔히말하는 ZIP, RAR처럼데이터들을하나로묶어놓는압
악성코드 분석을 위한 실행압축 해제 기법 NCSC-TR04025 악성코드분석을위한 실행압축 해제기법 1. 개요 이제목을보고 실행압축이뭐야? 하는이도있을테고, 실행하면자동으로압축이풀리는 ZIP 파일과비슷한거아냐? 하고떠올리는이도있을것이다. 그러나여기서설명하는실행압축은그대상이다르다. 흔히말하는 ZIP, RAR처럼데이터들을하나로묶어놓는압축과는달리그대상이 notepad.exe처럼실행할수있는파일을압축한것으로,
More informationMicrosoft PowerPoint - CSharp-10-예외처리
10 장. 예외처리 예외처리개념 예외처리구문 사용자정의예외클래스와예외전파 순천향대학교컴퓨터학부이상정 1 예외처리개념 순천향대학교컴퓨터학부이상정 2 예외처리 오류 컴파일타임오류 (Compile-Time Error) 구문오류이기때문에컴파일러의구문오류메시지에의해쉽게교정 런타임오류 (Run-Time Error) 디버깅의절차를거치지않으면잡기어려운심각한오류 시스템에심각한문제를줄수도있다.
More informationPowerPoint Presentation
자바프로그래밍 1 배열 손시운 ssw5176@kangwon.ac.kr 배열이필요한이유 예를들어서학생이 10 명이있고성적의평균을계산한다고가정하자. 학생 이 10 명이므로 10 개의변수가필요하다. int s0, s1, s2, s3, s4, s5, s6, s7, s8, s9; 하지만만약학생이 100 명이라면어떻게해야하는가? int s0, s1, s2, s3, s4,
More information1. Execution sequence 첫번째로 GameGuard 의실행순서는다음과같습니다 오전 10:10:03 Type : Create 오전 10:10:03 Parent ID : 0xA 오전 10:10:03 Pro
#44u61l5f GameGuard 에대한간단한분석. By Dual5651 (http://dualpage.muz.ro) 요약 : 이문서는분석자의입장에서 GameGuard의동작을모니터링한것에대한것입니다. 실제 GameGuard의동작방식과는다소차이가있을수있습니다. 이문서에등장하는모든등록상표에대한저작권은해당저작권자에게있습니다. 1. Execution sequence
More informationMicrosoft PowerPoint - chap11-포인터의활용.pptx
#include int main(void) int num; printf( Please enter an integer: "); scanf("%d", &num); if ( num < 0 ) printf("is negative.\n"); printf("num = %d\n", num); return 0; 1 학습목표 포인터를 사용하는 다양한 방법에
More informationBMP 파일 처리
BMP 파일처리 김성영교수 금오공과대학교 컴퓨터공학과 학습내용 영상반전프로그램제작 2 Inverting images out = 255 - in 3 /* 이프로그램은 8bit gray-scale 영상을입력으로사용하여반전한후동일포맷의영상으로저장한다. */ #include #include #define WIDTHBYTES(bytes)
More informationPowerPoint Presentation
Class - Property Jo, Heeseung 목차 section 1 클래스의일반구조 section 2 클래스선언 section 3 객체의생성 section 4 멤버변수 4-1 객체변수 4-2 클래스변수 4-3 종단 (final) 변수 4-4 멤버변수접근방법 section 5 멤버변수접근한정자 5-1 public 5-2 private 5-3 한정자없음
More informationChapter ...
Chapter 4 프로세서 (4.9절, 4.12절, 4.13절) Contents 4.1 소개 4.2 논리 설계 기초 4.3 데이터패스 설계 4.4 단순한 구현 방법 4.5 파이프라이닝 개요*** 4.6 파이프라이닝 데이터패스 및 제어*** 4.7 데이터 해저드: 포워딩 vs. 스톨링*** 4.8 제어 해저드*** 4.9 예외 처리*** 4.10 명령어 수준
More informationKNK_C_05_Pointers_Arrays_structures_summary_v02
Pointers and Arrays Structures adopted from KNK C Programming : A Modern Approach 요약 2 Pointers and Arrays 3 배열의주소 #include int main(){ int c[] = {1, 2, 3, 4}; printf("c\t%p\n", c); printf("&c\t%p\n",
More informationPowerPoint 프레젠테이션
KeyPad Device Control - Device driver Jo, Heeseung HBE-SM5-S4210 에는 16 개의 Tack Switch 를사용하여 4 행 4 열의 Keypad 가장착 4x4 Keypad 2 KeyPad 를제어하기위하여 FPGA 내부에 KeyPad controller 가구현 KeyPad controller 16bit 로구성된
More informationOCW_C언어 기초
초보프로그래머를위한 C 언어기초 2 장 : C 프로그램시작하기 2012 년 이은주 학습목표 을작성하면서 C 프로그램의구성요소 주석 (comment) 이란무엇인지알아보고, 주석을만드는방법 함수란무엇인지알아보고, C 프로그램에반드시필요한 main 함수 C 프로그램에서출력에사용되는 printf 함수 변수의개념과변수의값을입력받는데사용되는 scanf 함수 2 목차 프로그램코드
More informationAhnLab_template
Injection 기법및분석법 공개버전 2014.04.17 안랩시큐리티대응센터 (ASEC) 분석팀차민석책임연구원 Contents 01 02 03 04 05 06 07 왜 Injection 기법인가? Injection 기법배경지식 DLL Inection 기법 Code Injection 기법유용한도구 Case study 맺음말및과제 01 왜 Injection 기법인가?
More informationUI TASK & KEY EVENT
T9 & AUTOMATA 2007. 3. 23 PLATFORM TEAM 정용학 차례 T9 개요 새로운언어 (LDB) 추가 T9 주요구조체 / 주요함수 Automata 개요 Automata 주요함수 추후세미나계획 질의응답및토의 T9 ( 2 / 30 ) T9 개요 일반적으로 cat 이라는단어를쓸려면... 기존모드 (multitap) 2,2,2, 2,8 ( 총 6번의입력
More information1. auto_ptr 다음프로그램의문제점은무엇인가? void func(void) int *p = new int; cout << " 양수입력 : "; cin >> *p; if (*p <= 0) cout << " 양수를입력해야합니다 " << endl; return; 동적할
15 장기타주제들 auto_ptr 변환함수 cast 연산자에의한명시적형변환실행시간타입정보알아내기 (RTTI) C++ 프로그래밍입문 1. auto_ptr 다음프로그램의문제점은무엇인가? void func(void) int *p = new int; cout > *p; if (*p
More informationAdobe Flash 취약점 분석 (CVE-2012-0754)
기술문서 14. 08. 13. 작성 GNU C library dynamic linker $ORIGIN expansion Vulnerability Author : E-Mail : 윤지환 131ackcon@gmail.com Abstract 2010 년 Tavis Ormandy 에 의해 발견된 취약점으로써 정확한 명칭은 GNU C library dynamic linker
More informationMicrosoft PowerPoint - additional01.ppt [호환 모드]
1.C 기반의 C++ part 1 함수 오버로딩 (overloading) 디폴트매개변수 (default parameter) 인-라인함수 (in-line function) 이름공간 (namespace) Jong Hyuk Park 함수 Jong Hyuk Park 함수오버로딩 (overloading) 함수오버로딩 (function overloading) C++ 언어에서는같은이름을가진여러개의함수를정의가능
More informationWindows Server 2012
Windows Server 2012 Shared Nothing Live Migration Shared Nothing Live Migration 은 SMB Live Migration 방식과다른점은 VM 데이터파일의위치입니다. Shared Nothing Live Migration 방식은 Hyper-V 호스트의로컬디스크에 VM 데이터파일이위치합니다. 반면에, SMB
More informationISP and CodeVisionAVR C Compiler.hwp
USBISP V3.0 & P-AVRISP V1.0 with CodeVisionAVR C Compiler http://www.avrmall.com/ November 12, 2007 Copyright (c) 2003-2008 All Rights Reserved. USBISP V3.0 & P-AVRISP V1.0 with CodeVisionAVR C Compiler
More information슬라이드 1
명령어집합 주소지정모드 (addressing mode) 내용 명령어는크게연산자부분과이연산에필요한주소부분으로구성 이때주소부분은다양한형태를해석될수있으며, 해석하는방법을주소지정방식 ( 모드 )(addressing mode) 라한다. 즉피연산자정보를구하는방법을주소지정방식이라고함 명령어형식 주소지정 명령어형식에있는주소필드는상대적으로짧다. 따라서지정할수있는위치가제한된다.
More information<4D F736F F D20B9D9C0CCB7B5B9D9C0CCB7AFBDBA5FBCF6C1A42E646F63>
Virut 바이러스공격 ASEC 분석 1 팀고흥환선임연구원 해마다접수되는악성코드의통계를보면대부분이인터넷웜또는트로이목마가대부분을차지하며, 파일에기생하는바이러스는그수가적어지는것이추세이다. 그도그럴것이최근의악성코드특징은개인의능력과시가아닌돈과연관되는악성코드작성이대부분이기때문이다. 그렇다면 Virut 바이러스가인터넷웜과트로이목마를제치고국내뿐만아니라해외에서도큰피해를입히고있는이유가무엇인지,
More informationNo Slide Title
Copyright, 2017 Multimedia Lab., UOS 시스템프로그래밍 (Assembly Code and Calling Convention) Seong Jong Choi chois@uos.ac.kr Multimedia Lab. Dept. of Electrical and Computer Eng. University of Seoul Seoul, Korea
More informationIn this tutorial i'll try to cover all of the known methods(or at least, those that I know =p) of injecting dll's into a proce
DLL injection Written by Darawk 편역 : poc@securityproof.net * 이글은 Codebreakers Journal Vol.1, No.1, 2007 에서발표된것이며, 오역이나 오타가있을수있으니원문을참고시기바랍니다. 이문서에서, 나는프로세스에 dll을삽입하는알려진 ( 적어도내가아는한에서 ) 방법들모두를다룰것이다. Dll injection은
More informationPowerPoint Template
10 포인터 1 주소 Address( 주소 ) 메모리에는그메모리의저장장소의위치를나타내는주소값 주소 (address) 는 1 바이트마다 1 씩증가하도록메모리에는연속적인번호가구성 2 주소연산자 & & 변수 변수의주소값을알아내려면변수앞에주소연산자 & (ampersand) 를이용 주소값이용장단점 주소값을이용하면보다편리하고융통성있는프로그램이가능 그러나복잡하고어려운단점
More informationOCW_C언어 기초
초보프로그래머를위한 C 언어기초 4 장 : 연산자 2012 년 이은주 학습목표 수식의개념과연산자및피연산자에대한학습 C 의알아보기 연산자의우선순위와결합방향에대하여알아보기 2 목차 연산자의기본개념 수식 연산자와피연산자 산술연산자 / 증감연산자 관계연산자 / 논리연산자 비트연산자 / 대입연산자연산자의우선순위와결합방향 조건연산자 / 형변환연산자 연산자의우선순위 연산자의결합방향
More informationDLL(Dynamic Linked Library)
제 11 장동적연결라이브러리 11.1 DLL 의링크 11.2 DLL 의종류 실습 11-1 Implicit 링킹을통한정규 DLL 달력만들기 실습 11-2 Explicit 링킹을통한정규 DLL 달력만들기 실습 11-3 확장 DLL 을통한주민등록번호조회 프로그램만들기 DLL(Dynamic Linked Library) DLL 이란? 동적연결라이브러리 프로그램내부에라이브러리가있는것이아니라따로독립적으로실행가능한파일
More information커알못의 커널 탐방기 이 세상의 모든 커알못을 위해서
커알못의 커널 탐방기 2015.12 이 세상의 모든 커알못을 위해서 개정 이력 버전/릴리스 0.1 작성일자 2015년 11월 30일 개요 최초 작성 0.2 2015년 12월 1일 보고서 구성 순서 변경 0.3 2015년 12월 3일 오탈자 수정 및 글자 교정 1.0 2015년 12월 7일 내용 추가 1.1 2015년 12월 10일 POC 코드 삽입 및 코드
More information기술문서 LD_PRELOAD 와공유라이브러리를사용한 libc 함수후킹 정지훈
기술문서 LD_PRELOAD 와공유라이브러리를사용한 libc 함수후킹 정지훈 binoopang@is119.jnu.ac.kr Abstract libc에서제공하는 API를후킹해본다. 물론이방법을사용하면다른라이브러리에서제공하는 API들도후킹할수있다. 여기서제시하는방법은리눅스후킹에서가장기본적인방법이될것이기때문에후킹의워밍업이라고생각하고읽어보자 :D Content 1.
More informationMicrosoft PowerPoint - chap03-변수와데이터형.pptx
#include int main(void) { int num; printf( Please enter an integer: "); scanf("%d", &num); if ( num < 0 ) printf("is negative.\n"); printf("num %d\n", num); return 0; } 1 학습목표 의 개념에 대해 알아본다.
More informationPowerPoint 프레젠테이션
BOOTLOADER Jo, Heeseung 부트로더컴파일 부트로더소스복사및압축해제 부트로더소스는웹페이지에서다운로드 /working 디렉터리로이동한후, wget으로다운로드 이후작업은모두 /working 디렉터리에서진행 root@ubuntu:# cp /media/sm5-linux-111031/source/platform/uboot-s4210.tar.bz2 /working
More informationMicrosoft PowerPoint - 02_Linux_Fedora_Core_8_Vmware_Installation [호환 모드]
리눅스 설치 Vmware를 이용한 Fedora Core 8 설치 소프트웨어실습 1 Contents 가상 머신 실습 환경 구축 Fedora Core 8 설치 가상 머신 가상 머신 가상 머신의 개념 VMware의 설치 VMware : 가상 머신 생성 VMware의 특징 실습 환경 구축 실습 환경 구축 Fedora Core 8 설치 가상 머신의 개념 가상 머신 (Virtual
More informationMicrosoft PowerPoint 자바-기본문법(Ch2).pptx
자바기본문법 1. 기본사항 2. 자료형 3. 변수와상수 4. 연산자 1 주석 (Comments) 이해를돕기위한설명문 종류 // /* */ /** */ 활용예 javadoc HelloApplication.java 2 주석 (Comments) /* File name: HelloApplication.java Created by: Jung Created on: March
More informationSQL Developer Connect to TimesTen 유니원아이앤씨 DB 기술지원팀 2010 년 07 월 28 일 문서정보 프로젝트명 SQL Developer Connect to TimesTen 서브시스템명 버전 1.0 문서명 작성일 작성자
SQL Developer Connect to TimesTen 유니원아이앤씨 DB 팀 2010 년 07 월 28 일 문서정보 프로젝트명 SQL Developer Connect to TimesTen 서브시스템명 버전 1.0 문서명 작성일 2010-07-28 작성자 김학준 최종수정일 2010-07-28 문서번호 20100728_01_khj 재개정이력 일자내용수정인버전
More informationMicrosoft Word - [Windows Hook] 6.HideProcess.doc
Hide Process Last Update : 2007 년 6 월 11 일 Written by Jerald Lee Contact Me : lucid78@gmail.com 본문서는 SSDT Hook을이용한프로세스를감추는기술에대해정리한것입니다. 제가알고있는지식이너무짧아가급적이면다음에언제보아도쉽게이해할수있도록쓸려고노력하였습니다. 기존에나와있는여러훌륭한문서들을토대로짜집기의형태로작성되었으며기술하지못한원문저자들에게매우죄송할따름입니다.
More informationADP-2480
Mitsubishi PLC 접속 GP 는 Mitsubishi FX Series 와통신이가능합니다. 시스템구성 6 7 8 GP-80 RS- Cable RS-C Cable FXN--BD FXN--BD 6 FX Series(FXS,FXN,FXN,FXNC, FXU) 7 FXS, FXN 8 FXN FX Series 는기본적으로 RS- 통신을하며, RS-/ converter
More information