본문 바로가기

High Level Technique

Section Section 메모리구조나 리버싱 PE 구조를 공부하신 분이라면 Section에 대한 이야기를 들어보셨을 겁니다.ASM 코딩을 하는데 어떤 섹션이 어떻게 사용되는지 알아보도록 하죠. section .text텍스트 섹션은 실제 코드를 작성하는데 사용합니다. 이 섹션에서 global _start로 시작해야 합니다. section .data데이터 섹션은 초기화 된 데이터 또는 상수를 선언하는데 사용됩니다. 다양한 상수 값, 파일 이름, 버퍼 크기를 선언 할 수 있습니다. section .bssbss 섹션은 변수를 선언하는데 사용됩니다. 위 소스코드 처럼 section .text에서 global _start로 시작합니다.section .data에서 문자열과 그에 대한 길이(상수 값)을 작성하고, section .. 더보기
출력과 입력 출력과 입력 C언어에서는 출력과 입력을 할 때 printf와 scanf를 많이 사용합니다. 간결한 소스코드를 작성할 수 있죠.ASM에서도 출력과 입력을 할 수 있습니다. 먼저 간단히 C언어 소스코드를 보고 ASM으로 바꿔보도록 하겠습니다. IA-32 HelloWorld 소스코드를 분석 할때 출력에 대한 부분은 설명했으니 출력부분인 5~9, 17~21, 23~27과 종료부분인 29~31은 제외하고 값이 들어가는 부분에 대해서 설명하도록 하겠습니다. 입력을 받는 부분은 11~15줄에서 실행됩니다.11 : eax에 3을 저장합니다. read()를 부르기 위한 것 입니다.12 : ebx에 2를 저장합니다.13 : ecx에 num을 저장합니다.14 : edx에 5를 저장합니다.15 : 커널에 정보를 넘겨줍니다. .. 더보기
System Call System Call 앞서 포스팅 된 Hello World 소스코드를 분석하기 위해서는 System Call을 이해해야 합니다. 그럼 System Call에 대해서 알아보도록 하겠습니다. System Call이란? 시스템 콜은 운영체제가 인식하여 실행하기 위한 것 이라고 생각하면 쉽습니다.32비트와 64비트의 시스템 콜은 다르기 때문에 아래 내용을 확인해 보도록 하죠. x86 System Call Table: http://docs.cs.up.ac.za/programming/asm/derick_tut/syscalls.htmlx64 System Call Table: http://blog.rchapman.org/post/36801038863/linux-system-call-table-for-x86-64 위 사.. 더보기
Hello World Hello World 프로그래밍을 처음 시작 하시는 분들은 항상 먼저 출력해보는 것이 바로 Hello World 이지 않을까 싶습니다. 비교를 위해서 C언어로 작성된 Hello world와 ASM으로 작성된 Hello World를 보도록 하겠습니다. 아주 간단한 Hello World 출력 소스코드 입니다. 실행 시 Hello World\n가 출력됩니다. 이 소스코드를 ASM 코드로 바꾼다면 어떻게 될까요? 소스코드가 7줄에서 무려 18줄로 늘어났습니다. 당연한 결과입니다. 고급언어인 C언어를 저급언어인 ASM로 바꿨기 때문입니다. 추가적으로 C언어의 소스코드 파일 확장자는 *.c 이며, ASM 소스코드 파일 확장자는 *.nasm 입니다. 컴파일 및 실행방법 HelloWorld.c 파일은 우분투에서 다음과.. 더보기
IA-32, IA-64 Register IA-32, IA-64 Register 리버스 엔지니어링과 시스템 해킹을 하면서 자주보게 되는 레지스터에 대해서 알아보도록 하겠습니다. IA-32 Register EAX : 더하기, 빼기, 곱셈과 나눗셈 명령에서 자동으로 사용되고 함수의 리턴 값이 저장되는 용도로 사용됩니다. EBX : ESI, EDI와 결합하여 인덱스에 사용됩니다. ECX : 반복 명령어 사용 시 반복 카운터로 사용됩니다. ECX 레지스터에 반복할 회수를 지정해 놓고 반복 작업을 수행합니다. EDX : EAX와 같이 쓰이며 부화 확장 명령 등에 쓰입니다. 함수의 리턴 값이 저장되는 용도는 아닙니다. ESI : 데이터 복사, 조작시 시작지의 주소가 저장됩니다. ESI 레지스터가 가리키는 주소의 데이터를 EDI 레지스터가 가리키는 주소로 .. 더보기
Assembly Language Assembly Language 어셈블리 언어에 대해서 알고 계시나요? 어셈블리 언어는 리버스 엔지니어링이나 시스템 해킹을 하게 되면 자주 보는 언어입니다.프로그래밍을 처음 접하게 되면 아마 대부분은 C언어를 처음으로 시작하게 됩니다. 물론 C언어가 아니라 다른 언어부터 시작하는 분도 계시죠. C언어를 처음 공부하게 되면 '고급언어와 저급언어'에 대해서 공부하게 됩니다. C언어는 '고급언어'에 속하죠.하지만 어셈블리어는 '저급언어'에 속합니다. 고급언어는 프로그래머의 입장에서 만들어진 언어이고, 저급언어는 컴퓨터의 입장에서 만들어진 언어라고 생각하면 쉽습니다. 어셈블리어 종류 어셈블리어에는 여러 종류가 있습니다.IA-32, IA-64, ARM, MIPS가 존재하는데 intel cpu를 사용하기 때문에 I.. 더보기
Windows Massage Hooking Hook 이라는 단어는 고리, 걸이, 바늘 등의 뜻을 가지고 있습니다. Hook 이라는 말은 리버싱을 하면서 어떤 뜻으로 사용되나면 중간에 정보를 가로채는 것으로 사용됩니다. 간단히 설명하자면 키보드가 눌릴때 WM_KEYDOWN 메시지가 말생합니다. 이 메세지에 의해서 프로그램에서 키보드가 눌렸다라는 것을 알려주죠.이러한 메세지를 중간에 가로채는것을 Hooking이라고 합니다. Win32 API나 MFC를 해보셨다면 Window Massage에 대해서 조금은 아실 겁니다. Massage Hooking은 SetWindowsHookEx()라는 API를 이용해 간단히 구현할 수 있습니다. SetWindowsHookEx()의 원형은 다음과 같습니다. msdn에서 각 인자 값에 대한 설명은 다음과 같습니다. ht.. 더보기
.reloc section 제거 앞서 PE Relocation에 대해서 알아봤습니다. 해당 주소가 사용 중이라면 다른 임의의 주소로 이동한다는 개념이였습니다. 이러한 정보를 관리하는 곳이 reloc Section 이였다는 것도 말이죠. 하지만 reloc Section이 없어도 프로그램은 실행됩니다. 단지 재배치를 위한 것이기 때문이죠.ASLR 기능이 추가 되었다고 했는데, 이 기능은 보안상으로도 매우 중요한 역할을 합니다. reloc Section Header 정리 PEView에서 reloc Section의 File Offset은 280 입니다. 해당 주소 부터 모두 0으로 채워 주도록 합니다. reloc Section 제거 PEView에서 Pointer to Raw Data 값이 31600임을 알 수 있습니다. 해당 주소로 이동해서 .. 더보기
PE 재배치 (PE Relocation) PE Relocation PE파일인 exe, dll, sys 는 메모리에 로딩 될 때 ImageBase 주소에 로딩됩니다. 하지만 해당 주소에 이미 다른 파일이 로딩 되어있다면 어떻게 해야 할까요?? 앞서 IAT를 공부하면서 말했지만 다른 주소로 이동됩니다. 이렇게 다른 주소로 이동되는 것을 Relocation이라고 합니다. 좀 더 자세히 알아보도록 하겠습니다. DLL / SYS Relocation 메모리에 A.DLL 파일이 ImageBase에 맞게 100000000에 로딩되어 있습니다. 그러던 중 어떤 프로그램이 B.DLL이 로딩되려고 하는데 마찬가지로 ImageBase가 100000000 이여서해당 주소에 로딩 할려고 합니다. 그런데 이미 A.DLL이 먼저 로딩되어 있어서 B.DLL은 다른 주소를 찾.. 더보기
EAT (Export Address Table) EAT (Export Address Table) EAT는 라이브러리 파일에서 제공하는 함수를 다른 프로그램에서도 사용할 수 있도록 해주는 방법입니다.IAT에서 설명한것 처럼 프로그램 마다 동일한 라이브러리가 포함되어 실행되면 메모리 낭비가 심해지죠. EAT는 IMAGE_EXPORT_DIRECTORY에 그 내용을 저장하고 있습니다. IMAGE_EXPORT_DIRECTORY는 IMAGE_OPTIONAL_HEADER.DataDirectory[0]에 존재합니다. IMAGE_EXPORT_DIRECTORY 여기서 중요한 멤버는 다음과 같습니다. * NumberOfFunctions실제 Export 함수 개수를 나타냅니다. * NumberOfNamesExport 함수 중에서 이름을 가지는 함수 개수를 나타냅니다. ( 더보기
IAT (Import Address Table) IAT (Import Address Table) IAT는 프로그램에서 어떤 DLL을 사용하는지 알려주는 테이블입니다. *DLL ( Dynamic Linked Library)DLL은 프로그램마다 동일한 라이브러리가 포함되어 실행되면 메모리 낭비가 심해지기 때문에 이를 방지하기 위해서 DLL 파일을 만들어 프로그램이 필요할 때만 불러쓰도록 하기 위한 것입니다.또 한번 로딩된 DLL은 Memory Mapping을 이용하여 Process에서 공유해 쓰도록 합니다. *DLL 로딩 방식Explicit Linking: 프로그램에서 이용되는 순간에 로딩하고 사용이 끝나면 해제되는 방법.Implicit Linking: 프로그램이 시작할때 로딩되어 종료할 때 메모리에서 해제되는 방법. IAT는 Implicit Linkin.. 더보기
IMAGE_SECTION_HEADER 각 Section에 대한 이름을 비롯해 시작 주소와 사이즈 등의 정보를 관리하는 구조체 입니다. I - Name 섹션이 이름을 나타내는 멤버입니다.. 이 이름으로 섹션의 성격을 파악해서는 안 됩니다. 이유는 이 값이 NULL일 수도 있고 이름이 같다고 같은 속성을 갖는 것이 아니며 C언어처럼 NULL로 끝나는 것 도 아니고 ASCII 값만 와야한다는 제한도 없습니다. 섹션의 속성을 파악하기 위해서 Characteristics멤버를 참조해야 합니다. .text: 실행되는 코드들 .data: 초기화된 전역변수를 담고 있는 읽고 쓰기가 가능한 섹션 .rdtata: 읽기 전용 데이터 섹션, 문자열 표현이나 C++/com 가상 함수 테이블 .bss: 초기화되지 않은 전역 변수들을 위한 섹션 .idata: 다른 D.. 더보기
NT Header - IMAGE_OPTIONAL_HEADER - IMAGE_DATA_DIRECTORY Import 함수들을 조사할 때 DataDirctory의 두 번째 배열을 참조하게 되빈다. 각각 해당 영역으로 갈 수 있는 RVA주소와 그 영역의 크기에 대한 정보를 담고 있습니다.Import Table로 이동하면 IMAGE_IMPORT_DESCRIPTOR 구조체를 알 수 있는데 해당 파일이 import하고 있는 DLL과 함수 정보들을 가지고 있습니다.API 후킹 시에 사용되는 중요한 테이블입니다. 더보기
NT Header - IMAGE_OPTIONAL_HEADER -Magic IMAGE_OPTIONAL_HEADER32인지 64인지를 구별하기 위한 값으로 32bit는 0x10B, 64bit는 0x20B를 가집니다. - MajorLinkerVersion, MinorLinkerVersion 어떤 버전의 컴파일러로 빌드했는지 알 수 있다. - SizeOfCode 코드 양의 전체크기를 나타내며, 보통 .text Section의 파일 크기를 나타냅니다 .text Section의 SizeOfRawData와 같은 값을 갖는다. 바이러스나 악성코드는 이 영역을 읽어 코드를 복제할 위치를 잡기도하고 보안 솔루션에서는 무결성 검사를 수행할 때 이 섹션 값을 얻어와 검사크기를 잡는다. - AddressOfEntryPoint 실제 파일이 메모리에 실행되는 시작지점이며 EP(Entry P.. 더보기
NT Header - IMAGE_NT_HEADER - IMAGE_FILE_HEADER IMAGE_FILE_HEADER는 실행파일들의 구성 정보가 들어있습니다. 현재 파일이 EXE파일인지, DLL파일인지, Section의 개수는 몇 개인지, 어느 플랫폼에서 실행되는지에 대한 정보가 들어있습니다. - Machine 현재 파일이 어느 플랫폼(CPU)에서 실행되는지에 대한 정보를 가지고 있습니다. 이 값은 CPU별로 고유한 값을 가집니다. Intel x86은 0x14C, Intel x64는 0x200의 값을 가지고 있습니다. - NumberOfSections Section의 개수를 나타내며, 정의된 Section의 개수와 실제 Section의 개수가 다르면 에러가 발생합니다. - TimeDateStamp 파일이 빌드된 시간을 나타냅니다. 정확하게는 OBJ 파일이 EXE로 만들어지는 시간입니다. .. 더보기
NT Header - IMAGE_NT_HEADER e_lfanew의 값인 E0 00 00 00 (00 00 00 E0)이 NT Header의 Offset입니다. 해당 값을 주소로 이동하면 IMAGE_NT_HEADER의 시작 주소 입니다.리틀 엔디안이라는 것에 주의합니다. - SignaturePE\0\0의 값을 갖습니다. PE 파일이라고 표시하는 용도로만 사용됩니다.과거 바이러스 제작자들이 자신의 값을 표시하기 위해 사용했었지만 마이크로소프트에서 이러한 변조가 나타나면 실행시키지 않도록 보안하고 있습니다. 더보기
DOS Header - DOS Stub DOS Stub의 존재 여부는 옵션이며 크기도 일정하지 않고, 해당 부분이 없어도 실행이 가능합니다. 이 부분을 실행하기 위해서는 DOS 환경에서 실행하거나, DOS용 디버거를 이용해 실행하면 됩니다. 더보기
DOS Header - IMAGE_DOS_HEADER DOS Header는 DOS 파일에 대한 하위 호환성을 고려해서 만들어 졌습니다. DOS Header - IMAGE_DOS_HEADER에서 중요한 멤버들만 살펴보도록 하겠습니다. - e_magic Magic Number라고 부르며, 값은 4D 5A입니다. DOS Signature이며 현재 파일이 PE 파일인지 체크합니다. MZ는 Mark Zbikowski의 약자입니다. 값은 5A4D, 454E, 454C, 00004550이 존재합니다. - e_lfanew NT Header의 Offset을 가리킵니다. 파일에 따라 다른 값을 갖습니다. 더보기
PE 리버싱에서 가장 중요한? 정말 잘 알고 있다면 정말 좋은 PE 구조에 대해서 알아보도록 하겠습니다. PE는 Portable Executable File Format의 약자입니다.이 말이 무었이냐면 이식 가능한 다른 곳에 옮겨저도 실행가능 하도록 만들어 놓은 포맷입니다. 쉽게 말하면 어느 곳에서나 실행이 가능하도록 만들어진 포맷이라고 생각하면 됩니다.32bit는 PE32라고 부르고 64bit는 PE64가 아닌 PE32+ 또는 PE+ 라고 부릅니다. PE파일 종류는 다음과 같습니다. EXE, SCR, SYS, VXD, DLL, OCX, CPL, DRV, OBJ 파일이 있습니다. OBJ 파일을 제외하고 간접적(서비스, 디버깅, 레지스트리)에 의해 실행이 가능한 파일입니다. PE의 기본구조는 다음과 같습니다. .. 더보기
RAV to RAW RVA to RAW는 RVA 값이 있을 때, 해당 Section이 어디인지 찾는 방법을 말합니다. RAW는 File Offset을 말합니다. 먼저 아래 그림을 보도록 할께요. 왼쪽은 파일에서의 위치를 나타내고 오른쪽은 메모리상에서의 위치를 나타냅니다. RAW를 구하는 방법은 다음과 같습니다. RAW = RVA - VirtualAddress + PointerToRawDataRAW = RVA - VA + PTRD 풀어서 말하자면, 파일의 임의위치(RAW) = 메모리의 임의위치(RVA) - 메모리의 해당 섹션 시작위치(VA) + 파일의 해당 섹션 시작위치(PTRD) 입니다. 간단한 예를 들어서 마치도록 하겠습니다. =====================================================.. 더보기
VA & RVA PE 구조를 배우기 앞서서 VA와 RVA에 대해서 알아보도록 하겠습니다. VA는 Virtual Address로 가상주소를 뜻하며, RVA는 Relative Virtual Address로 상대주소를 뜻합니다. RVA는 상대주로라고 말했는데 ImageBase부터의 상대주소를 뜻합니다. 가상 메모리에서의 Offset 개념입니다. Offset은 파일에서의 위치를 나타냅니다. 즉, RVA는 메모리에서의 위치라고 생각하시면 됩니다. 이렇게 글로만 봐서는 쉽게 이해하기 어렵습니다. 뒤에 이어지는 PE구조를 공부하시다 보면 쉽게 이해가 되실겁니다. 우리가 사용하는 시스템은 다음과 같이 메모리를 사용하게 됩니다. 물리주소를 보면 빨간 영역은 프로그램이 할당되어 사용되어지고 있는 영역입니다. 파란 영역은 사용되지 않고 있.. 더보기
분석방법 - 문자열 검색프로그램의 메시지창이나 문자열들이 나타난다면 해당 문자열을 찾아 분석하면 쉽다. 오른쪽 마우스 - Search for - All referenced Text Strings - API 검색 1프로그램이 작동하는 구성을 먼저 파악한다. 만약 메시지창이 나오게 된다면 MessageBoxW API를 사용했을 것이다.그렇다면 해당 API를 찾는 것이다. 이 방법은 호출되는 실제 주소에 BP가 걸리게 된다. 오른쪽 마우스 - Search for - All intermodular calls - API 검색 2마찬가지로 API를 찾는 방법이지만 실제 작동하는 MessageBoxW 영역으로 이동해서 스택을 확인해 어디에서 호출되었는지 확인하는 방법이다. Memory Map - USER32 영역 - 오른쪽 .. 더보기
주요 단어 - Opcode Opcode(옵코드)는 명령어라고 생각하면 된다. JMP, MOV 등등.. - Operand Operand(오퍼랜드)는 인자라고 생각하면 된다. EAX, EBX 등등.. MOV EBP, ESP 라고 한다면 MOV가 Opcode이고, EBP, ESP가 Operand라고 생각하면 된다. - Entry Point (EP) EP(엔트리 포인트) Windows 실행파일의 코드 시작점이다. - VA (Vritual Address) 가상 메모리의 절대주소. 실제 물리적인 주소를 가상 주소로 사용한다. - RVA (Relative Virtual Address) ImageBase부터의 상대주소를 말한다. 가상 메모리에서의 Offset 개념. - Offset 파일에서의 위치를 나타낸다. 더보기
Stack, Calling Conventions 스택은 프로그래밍을 한다면 누구나 들었을 말입니다. 스택은 LIFO (Last In First Out)입니다. 즉, 나중에 들어온 값이 먼저 나간다라는 말이죠. 스택에 넣을때는 PUSH라고 하며, 빼낼때는 POP이라고 합니다. 그리고 스택은 항상 "높은주소에서 낮은주소로 자랍니다." 즉, "거꾸로 자란다."라는 말이죠.이 이유는 다른 영역에 침범하지 않기 위해서 그렇습니다. 먼저 간단히 해당 영역이 어떤 역할을 하는지 알아보도록 하겠습니다. Text 영역 : 컴파일 된 프로그램 소스가 기계어 형태로 있는 영역입니다.Data 영역: 프로그램에서 초기화 된 데이터들이 위치합니다.BSS 영역: 초기화되지 않은 변수들이 위치해있고, 항상 0으로 초기화 됩니다.Stack 영역: 지역변수가 위치합니다.Heap 영역.. 더보기
Byte Ordering 바이트 오더링 (Byte Ordering) 바이트 오더링이란 데이터를 저장하는 방식을 말합니다. 저장하는 방식에는 리틀 엔디안(Little Endian), 빅 엔디안(Big Endian) 방식이 있습니다. 이 2가지 방식에 대해서 알아보도록 하겠습니다. 리틀 엔디안 방식은 인텔 프로세서나 DEC의 알파 프로세서에서 사용합니다.수의 값을 증가시킬 때 수의 왼편에 자릿수를 추가해야할 필요가 있을지도 모르기 때문에 사용됩니다. 따라서, 확장 축소에 더 효율적이죠. 빅 엔디안 방식은 RISC기반의 컴퓨터와 모토로라, 대형 UNIX서버에서 사용합니다.사람들이 왼쪽에서 오른쪽으로 언어를 사용하기 때문에 빅 엔디안 방식이 자연스럽죠. 다음과같은 소스가 있다고 하죠. BYTE b = 0x12;WORD w = 0x123.. 더보기
Back To User Mode Back To User Mode는 특정 이벤트를 일어나기 전에 설정해두고 Call 명령이 일어난 바로 다음 위치를 잡을 수 있습니다. UPX Unpacking에서 사용했던 파일로 Back To User Mode에 대해서 알아보도록 하겠습니다. Back To User Mode 는 다음과 같이 사용합니다. 1. 분석하고자 하는 프로그램을 올리디버거로 실행합니다.2. F9를 눌러 실행시킵니다.3. F12를 눌러 프로그램을 일시정시 상태로 둡니다.4. Alt + F9를 눌으면 Back To User Mode가 설정됩니다.5. 프로그램에서 이벤트가 발생합니다. (메시지창 출력)6. 올리디버거가 해당 부분에 커서가 이동됩니다. 1. 실행하기 2. 임의의 시리얼을 입력후 메시지 창을 띄웁니다. 3. 올리디버거로 돌아.. 더보기
UPX Unpacking OllyDump.dll 파일을 Plugin 폴더에 넣어주세요~ 해당 파일을 먼저 실행해 봅니다. Check the Serial 버튼과 Leave this CrackMe 버튼이 있습니다. 임의의 값을 넣고 Check 버튼을 눌러보도록 하겠습니다. 임의의 시리얼로 k3y6reak를 입력했더니 오른쪽 메시지 창처럼 올바른 시리얼이 아니라고 합니다. 그렇다면 먼저 PEID로 해당 파일을 분석해보도록 하겠습니다. UPX로 패킹 되어있다는 정보를 알 수 있습니다. 올리디버거로 해당 파일을 분석해보면, UPX 패킹이 되어있다는 것을 알 수 있습니다. UPX 패킹인지 알 수 있는 방법은 PEID로 확인하거나 어셈블리어가 마지막에 JMP가 나오게 되고 어디론가 점프한다는 것으로 알 수 있습니다. 브레이크 포인트를 걸어둔.. 더보기
데이터 타입, 피연산자 타입, 어셈블리 언어 어셈블리 언어를 외우려고 하지말자. 계속 분석을 하다보면 대부분 나오는 것만 나오게 된다.처음 시작한다면, 한두번 읽고 넘어가는 것을 추천합니다. 다 외울 수 있으면 좋겠지만...ㅋㅋㅋㅋ 사람머리인지라.. - 데이터 타입 타입 설명 BYTE 8비트 부호 없는 정수 SBYTE 8비트 부호 있는 정수 WORD 16비트 부호 없는 정수 SWORD 16비트 부호 있는 정수 DWORD 32비트 부호 없는 정수 SDWORD 32비트 부호 있는 정수 FWORD 48비트 정수 QWORD 64비트 정수 TBYTE 80비트 정수 - 피연산자 (Operand) 타입 피연산자 설명 r8 8비트 범용 레지스터 r16 16비트 범용 레지스터 r32 32비트 범용 레지스터 Reg 임의의 범용 레지스터 Sreg 16비트 세그먼트 레.. 더보기
CPU 레지스터 CPU 레지스터에는 범용 레지스터, 명령 포인터, 세그먼트 레지스터, 플래그 레지스터, 부통소수점 데이터 레지스터 이렇게 총 5개가 있습니다. ※ CPU 레지스터를 외울려고 하지 말자. 그때 그때 확인하는 정도로도 충분하다고 생각된다. 단순히 변수가 변경된다고 생각해도 충분하다고 생각된다. - 범용 레지스터 EAX (Extended Accumulator Register)더하기, 빼기, 곱셈과 나눗셈 명령에서 자동으로 사용되고 함수의 리턴값이 저장되는 용도.가장 많이 쓰이는 변수라고 생각하면 된다. 사칙연산에 사용되고, return 100, return 0을 하면 반환하는 것처럼 EAX에 100, 0이 입력된다고 생각하면 된다. EBX (Extended Base Register)ESI나 EDI와 결합하여 .. 더보기
OllyDBG 다운로드 및 설정방법 올리디버거는 http://ollydbg.de 에서 다운로드 받을 수 있습니다. 최근 올리디버거가 x64 환경에서도 작동되도록 버전이 출시가 되었습니다. 사실 아직 써보지는 않아서 잘 작동하는지는 모르겠습니다.하지만 저는 XP 32bit 환경에서 리버싱을 공부하기 때문에 Odbg110.zip 파일을 받도록 하겠습니다. 압축을 풀면 다음과 같은 파일들이 생성됩니다. 해당 파일을 받아서 압축을 풀어서 odbg110 폴더에 넣어줍니다.UDD 폴더와 Plugin 폴더를 생성합니다. OLLYDBG.EXE 를 실행합니다. 상단의 Options - Appearance를 클릭합니다. Directories를 선택하면 UDD path와 Plugin path가 나옵니다.아까 UDD와 Plugin 폴더를 만들었던 경로로 잡아줍.. 더보기