이미 소장하고 있다면 판매해 보세요.
|
1부 기초 리버싱
1장 Reversing Story 1.1. Reverse Engineering(RE) 1.2. Reverse Code Engineering(RCE) 1.2.1. 리버싱(분석) 방법 1.2.2. Source Code, Hex Code, Assembly Code 1.2.3. 패치와 크랙 1.3. 리버싱 준비물 1.3.1. 목표 1.3.2. 열정 1.3.3. 구글 1.4. 리버싱 방해물 1.4.1. 과욕 1.4.2. 조급함 1.5. 리버싱의 묘미 2장 Hello World! 리버싱 2.1. Hello World! 프로그램 2.1.1. 디버거와 어셈블리 언어 2.2. HelloWorld.exe 디버깅 2.2.1. 디버깅 목표 2.2.2. 디버깅 시작 2.2.3. EP 2.2.4. 40270C 함수 따라가기 2.2.5. 40104F 점프문 따라가기 2.2.6. main( ) 함수 찾기 2.3. 디버거 좀 더 능숙하게 다루기 2.3.1. 디버거 명령어 2.3.2. 베이스 캠프 2.3.3. 베이스 캠프를 설치하는 4가지 방법 2.4. 원하는 코드를 빨리 찾아내는 4가지 방법 2.4.1. 코드 실행 방법 2.4.2. 문자열 검색 방법 2.4.3. API 검색 방법 (1) - 호출 코드에 BP 2.4.4. API 검색 방법 (2) - API 코드에 직접 BP 2.5. “Hello World!” 문자열 패치 2.5.1. 패치 2.5.2. 문자열을 패치하는 두 가지 방법 2.6. 마무리 3장 Little Endian 표기법 3.1. 바이트 오더링 49 3.1.1. 리틀 엔디안 & 빅 엔디안 3.1.2. OllyDbg에서 리틀 엔디안 확인 4장 IA-32 Register 기본 설명 4.1. CPU 레지스터란? 4.1.1. 레지스터에 대해서 알아야 하는 이유 4.2. IA-32의 레지스터 4.2.1. Basic program execution registers 4.3. 마무리 5장 Stack 5.1. 스택 5.1.1. 스택의 특징 5.1.2. 스택 동작 예제 6장 abex crackme #1 분석 6.1. abex’ crackme #1 6.1.1. Start debugging 6.1.2. 코드 분석 6.2. 크랙 6.3. 스택에 파라미터를 전달하는 방법 6.4. 마무리 7장 Stack Frame 7.1. 스택 프레임 7.2. 실습 예제 - stackframe.exe 7.2.1. StackFrame.cpp 7.2.2. main( ) 함수 시작 & 스택 프레임 생성 7.2.3. 로컬 변수 셋팅 7.2.4. add( ) 함수 파라미터 입력 및 add( ) 함수 호출 7.2.5. add( ) 함수 시작 & 스택 프레임 생성 7.2.6. add( ) 함수의 로컬 변수(x, y) 셋팅 7.2.7. ADD 연산 7.2.8. add( ) 함수의 스택 프레임 해제 & 함수 종료(리턴) 7.2.9. add( ) 함수 파라미터 제거(스택 정리) 7.2.10. printf( ) 함수 호출 7.2.11. 리턴 값 셋팅 7.2.12. 스택 프레임 해제 & main( ) 함수 종료 7.3. OllyDbg 옵션 변경 7.3.1. Disasm 옵션 7.3.2. Analysis1 옵션 7.4. 마무리 8장 abex crackme #2 8.1. abex’ crackme #2 실행 8.2. Visual Basic 파일 특징 8.2.1. VB 전용 엔진 8.2.2. N(Native) code, P(Pseudo) code 8.2.3. Event Handler 8.2.4. undocumented 구조체 8.3. Start debugging 8.3.1. 간접호출 8.3.2. RT_MainStruct 구조체 8.3.3. ThunRTMain( ) 함수 8.4. crackme 분석 8.4.1. 문자열 검색 8.4.2. 문자열 주소 찾기 8.4.3. Serial 생성 알고리즘 8.4.4. 코드 예측하기 8.4.5. Name 문자열 읽는 코드 8.4.6. 암호화 루프 8.4.7. 암호화 방법 8.5. 마무리 9장 Process Explorer - 최고의 작업 관리자 9.1. Process Explorer 9.2. 구체적으로 뭐가 좋은 거죠? 9.3. sysinternals 10장 Calling Convention 10.1. Calling Convention 10.1.1. cdecl 10.1.2. stdcall 10.1.3. fastcall 11장 Lena’s Reversing for Newbies 11.1. 실행 11.2. 분석 11.2.1. 목표(1) - 메시지 박스 제거! 11.2.2. 패치(1) - 메시지 박스 제거 11.2.3. 목표(2) - Registration Code 찾기 11.3. 마무리 12장 도대체 리버싱을 어떻게 공부해야 하나요? 12.1. Reverse Engineering(RE) 12.1.1. 모든 공부에는 ‘목표’가 있어야 합니다. 12.1.2. ‘긍정적인 마인드’를 가지세요. 12.1.3. ‘재미’를 느껴야 합니다. 12.1.4. ‘검색’을 생활화해야 합니다. 12.1.5. 제일 중요한 건 ‘실천’입니다. 12.1.6. ‘느긋한 마음’을 가지세요. 2부 PE File Format 13장 PE File Format 13.1. Introduction 13.2. PE File Format 13.2.1. 기본 구조 13.2.2. VA & RVA 13.3. PE 헤더 13.3.1. DOS Header 13.3.2. DOS Stub 13.3.3. NT Header 13.3.4. IMAGE_NT_HEADERS - IMAGE_FILE_HEADER 13.3.5. IMAGE_NT_HEADERS - IMAGE_OPTIONAL_HEADER32 13.3.6. 13.4. RVA to RAW 13.5. IAT 13.5.1. DLL 13.5.2. IMAGE_IMPORT_DESCRIPTOR 13.5.3. notepad.exe를 이용한 실습 13.6. EAT 13.6.1. IMAGE_EXPORT_DIRECTORY 13.6.2. kernel32.dll을 이용한 실습 13.7. Advanced PE(Portable Executable) 13.7.1. PEView.exe 13.7.2. Patched PE 13.8. 마무리 14장 실행 압축 14.1. 데이터 압축 14.1.1. 비손실 압축 14.1.2. 손실 압축 14.2. 실행 압축 14.2.1. 패커 14.2.2. 프로텍터 14.3. 실행 압축 테스트 14.3.1. notepad.exe와 notepad_upx.exe 파일 비교 15장 UPX 실행 압축된 notepad 디버깅 15.1. notepad.exe의 EP Code 15.2. notepad_upx.exe의 EP Code 15.3. UPX 파일 트레이싱 15.3.1. OllyDbg의 트레이스 명령어 15.3.2. 루프 #1 15.3.3. 루프 #2 15.3.4. 루프 #3 15.3.5. 루프 #4 15.4. UPX의 OEP를 빨리 찾는 방법 15.4.1. POPAD 명령어 이후의 JMP 명령어에 BP 설치 15.4.2. 스택에 하드웨어 브레이크 포인트(Hardware Break Point) 설치 15.5. 마무리 16장 Base Relocation Table 16.1. PE 재배치 16.1.1. DLL/SYS 16.1.2. EXE 16.2. PE 재배치 발생시 수행되는 작업 16.3. PE 재배치 동작 원리 16.3.1. Base Relocation Table 16.3.2. IMAGE_BASE_RELOCATION 구조체 16.3.3. Base Relocation Table의 해석 방법 16.3.4. 실습 17장 실행 파일에서 .reloc 섹션 제거하기 17.1. .reloc 섹션 17.2. reloc.exe 17.2.1. .reloc Section Header 정리 17.2.2. .reloc 섹션 제거 17.2.3. IMAGE_FILE_HEADER 수정 17.2.4. IMAGE_OPTIONAL_HEADER 수정 17.3. 마무리 18장 UPack PE 헤더 상세 분석 18.1. UPack 설명 18.2. UPack으로 notepad.exe 실행 압축하기 18.3. Stud_PE 이용 18.4. PE 헤더 비교 18.4.1. notepad.exe(원본)의 PE 헤더 18.4.2. notepad_upack.exe(실행 압축)의 PE 헤더 18.5. UPack의 PE 헤더 분석 18.5.1. 헤더 겹쳐쓰기 18.5.2. IMAGE_FILE_HEADER.SizeOfOptionalHeader 18.5.3. IMAGE_OPTIONAL_HEADER.NumberOfRvaAndSizes 18.5.4. IMAGE_SECTION_HEADER 18.5.5. 섹션 겹쳐쓰기 18.5.6. RVA to RAW 18.5.7. Import Table(IMAGE_IMPORT_DESCRIPTOR array) 18.5.8. IAT(Import Address Table) 18.6. 마무리 19장 UPack 디버깅 - OEP 찾기 19.1. OllyDbg 실행 에러 19.2. 디코딩 루프 19.3. IAT 셋팅 19.4. 마무리 20장 인라인 패치 실습 20.1. 인라인 패치 20.2. 실습 - Patchme 20.3. 디버깅 - 코드 흐름 살펴보기 20.4. 코드 구조 20.5. 인라인 패치 실습 20.5.1. 패치 코드를 어디에 설치할까? 20.5.2. 패치 코드 만들기 20.5.3. 패치 코드 실행하기 20.5.4. 결과 확인 3부 DLL Injection 21장 Windows 메시지 후킹 21.1. 훅 21.2. 메시지 훅 21.3. SetWindowsHookEx ( ) 21.4. 키보드 메시지 후킹 실습 21.4.1. 실습 예제 HookMain.exe 21.4.2. 소스코드 분석 21.5. 디버깅 실습 21.5.1. HookMain.exe 디버깅 21.5.2. Notepad.exe 프로세스내의 KeyHook.dll 디버깅 21.6. 마무리 22장 악의적인 목적으로 사용되는 키로거 22.1. 악성 키로거의 목표 22.1.1. 온라인 게임 22.1.2. 인터넷 뱅킹 22.1.3. 기업 정보 유출 22.2. 키로거의 종류와 향후 발전 방향 22.3. 키로거에 대처하는 우리의 자세 22.4. 개인정보 23장 DLL Injection 23.1. DLL 인젝션 23.2. DLL 인젝션 활용 예 23.2.1. 기능 개선 및 버그 패치 23.2.2. 메시지 후킹 23.2.3. API 후킹 23.2.4. 기타 응용 프로그램 23.2.5. 악성 코드 23.3. DLL 인젝션 구현 방법 23.4. CreateRemoteThread ( ) 23.4.1. 실습 예제 myhack.dll 23.4.2. 예제 소스코드 분석 23.4.3. 디버깅 방법 23.5. AppInit_DLLs 23.5.1. 예제 소스코드 분석 23.5.2. 실습 예제 myhack2.dll 23.6. SetWindowsHookEx ( ) 23.7. 마무리 24장 DLL Ejection 24.1. DLL 이젝션 동작 원리 24.2. DLL 이젝션 구현 24.2.1. 프로세스에 로딩된 DLL 정보 구하기 24.2.2. 대상 프로세스 핸들 구하기 24.2.3. FreeLibrary( ) API 주소 구하기 24.2.4. 대상 프로세스에 스레드를 실행시킴 24.3. DLL 이젝션 간단 실습 24.3.1. 파일 복사 및 notepad.exe 실행 24.3.2. 인젝션 24.3.3. 이젝션 25장 PE Patch를 이용한 DLL 로딩 25.1. 실습 파일 25.1.1. TextView.exe 25.1.2. TextView_patched.exe 25.2. 소스코드 - myhack3.cpp 25.2.1. DllMain( ) 25.2.2. DownloadURL( ) 25.2.3. DropFile( ) 25.2.4. dummy( ) 25.3. TextView.exe 파일 패치 준비 작업 25.3.1. 패치 아이디어 25.3.2. 패치 사전 조사 25.3.3. IDT 이동 25.4. TextView.exe 패치 작업 25.4.1. IMPORT Table의 RVA 값 변경 25.4.2. BOUND IMPORT TABLE 제거 25.4.3. 새로운 IDT 생성 25.4.4. Name, INT, IAT 셋팅 25.4.5. IAT 섹션의 Characteristics 변경 25.5. 검증 (Test) 25.6. 마무리 26장 PE Tools 26.1. PE Tools 26.1.1. 프로세스 메모리 덤프 26.1.2. PE Editor 26.2. 마무리 쉬어가기 - 리버싱의 참맛 27장 Code Injection 27.1. Code 인젝션 27.2. DLL 인젝션 vs Code 인젝션 27.2.1. 코드 인젝션을 사용하는 이유 27.3. 실습 예제 27.3.1. notepad.exe 실행 27.3.2. CodeInjection.exe 실행 27.3.3. 메시지 박스 확인 27.4. CodeInjection.cpp 27.4.1. main( ) 27.4.2. ThreadProc( ) 27.4.3. InjectCode( ) 27.5. Code 인젝션 디버깅 실습 27.5.1. notepad.exe 디버깅 27.5.2. OllyDbg 옵션 변경 27.5.3. CodeInjection.exe 실행 27.5.4. 스레드 시작 코드 27.6. 마무리 28장 어셈블리 언어를 이용한 Code Injection 28.1. 목표 28.2. 어셈블리 프로그래밍 28.3. OllyDbg의 Assemble 명령 28.3.1. ThreadProc( ) 작성 28.3.2. Save File 28.4. 인젝터 제작 28.4.1. ThreadProc( ) 함수의 바이너리 코드 얻기 28.4.2. CodeInjection2.cpp 28.5. 디버깅 실습 28.5.1. notepad.exe 디버깅 28.5.2. OllyDbg 옵션 변경 28.5.3. CodeInjection2.exe 실행 28.5.4. 스레드 시작 코드 28.6. 상세 분석 28.6.1. 스택 프레임 28.6.2. THREAD_PARAM 구조체 포인터 28.6.3. “user32.dll” 문자열 28.6.4. “user32.dll” 문자열 파라미터 입력 28.6.5. LoadLibraryA(“user32.dll”) 호출 28.6.6. “MessageBoxA” 문자열 28.6.7. GetProcAddress(hMod, “MessageBoxA”) 호출 28.6.8. MessageBoxA( ) 파라미터 입력 1 - MB_OK 28.6.9. MessageBoxA( ) 파라미터 입력 2 - “ReverseCore” 28.6.10. MessageBoxA( ) 파라미터 입력 3 - “www.reversecore.com” 28.6.11. MessageBoxA( ) 파라미터 입력 4 - NULL 28.6.12. MessageBoxA 호출 28.6.13. ThreadProc( ) 리턴 값 셋팅 28.6.14. 스택 프레임 해제 및 함수 리턴 28.7. 마무리 4부 API Hooking 29장 API Hooking: 리버싱의 ‘꽃’ 29.1. 후킹 29.2. API 29.3. API 후킹 29.3.1. 정상 API 호출 29.3.2. 후킹 API 호출 29.4. 테크 맵 29.4.1. Method Object(what) 29.4.2. Location(where) 29.4.3. Technique(How) 29.5. API 30장 메모장 WriteFile ( ) 후킹 30.1. 테크 맵 - 디버그 테크닉 30.2. 디버거 설명 30.2.1. 용어 30.2.2. 디버거 기능 30.2.3. 디버거 동작 원리 30.2.4. 디버그 이벤트 30.3. 작업 순서 30.4. 실습 30.5. 동작 원리 30.5.1. 스택 30.5.2. 실행 흐름 30.5.3. 언훅 & 훅 30.6. 소스코드 설명 30.6.1. main( ) 30.6.2. DebugLoop( ) 30.6.3. EXIT_PROCESS_DEBUG_EVENT 30.6.4. CREATE_PROCESS_DEBUG_EVENT - OnCreateProcessDebug Event( ) 30.6.5. EXCEPTION_DEBUG_EVENT - OnExceptionDebugEvent( ) 31장 디버거 이야기 31.1. OllyDbg 31.2. IDA Pro 31.3. WinDbg 32장 계산기, 한글을 배우다 32.1. 테크 맵 32.2. 대상 API 선정 32.3. IAT 후킹 동작 원리 32.4. 실습 32.5. 소스코드 분석 32.5.1. DllMain( ) 32.5.2. MySetWindowTextW( ) 32.5.3. hook_iat ( ) 32.6. 인젝션된 DLL의 디버깅 32.6.1. DllMain( ) 32.6.2. hook_iat ( ) 32.6.3. MySetWindowTextW( ) 32.7. 마무리 33장 ‘스텔스’ 프로세스 33.1. 테크 맵 33.2. API 코드 패치 동작 원리 33.2.1. 후킹 전 33.2.2. 후킹 후 33.3. 프로세스 은폐 33.3.1. 프로세스 은폐 동작 원리 33.3.2. 관련 API 33.3.3. 은폐 기법의 문제점 33.4. 실습 #1 (HideProc.exe, stealth.dll) 33.4.1. notepad.exe, procexp.exe, taskmgr.exe 실행 33.4.2. HideProc.exe 실행 33.4.3. stealth.dll 인젝션 확인 33.4.4. notepad.exe 프로세스 은폐 확인 33.4.5. notepad.exe 프로세스 은폐 해제 33.5. 소스코드 분석 33.5.1. HookProc.cpp 33.5.2. stealth.cpp 33.6. 글로벌 API 후킹 33.6.1. Kernel32.CreateProcess ( ) API 33.6.2. Ntdll.ZwResumeThread ( ) API 33.7. 실습 #2(HideProc2.exe, stealth2.dll) 33.7.1. stealth2.dll 파일을 %SYSTEM% 폴더에 복사 33.7.2. HideProc2.exe -hide 실행 33.7.3. ProcExp.exe & notepad.exe 실행 33.7.4. HideProc2.exe -show 실행 33.8. 소스코드 분석 33.8.1. HideProc2.cpp 33.8.2. stealth2.cpp 33.9. 핫 패치 방식의 API 후킹 33.9.1. 기존 API 코드 패치 방법의 문제점 33.9.2. 핫 패치 (7바이트 코드 패치) 33.10. 실습 #3 - stealth3.dll 33.11. 소스코드 분석 33.11.1. Stealth3.cpp 33.12. 핫 패치 방식의 API 후킹에서 고려사항 33.12. 마무리 34.1. 후킹 대상 API 34.1.1. 검증 ? IE 프로세스 디버깅 34.2. IE 프로세스 구조 34.3. 글로벌 API 후킹 개념 정리 34.3.1. 일반적인 API 후킹 34.3.2. 글로벌 API 후킹 34.4. ntdll!ZwResumeThread ( ) API 34.5. 실습 예제 ? IE 접속 제어 34.5.1. IE 실행 34.5.2. DLL 인젝션 34.5.3. 새로운 탭 생성 34.5.4. 포털 사이트 접속 34.5.5. DLL 이젝션 34.5.6. 추가 실습 34.6. 예제 소스코드 34.6.1. DllMain( ) 34.6.2. NewInternetConnectW( ) 34.6.3. NewZwResumeThread( ) 34.7. 마무리 35장 좋은 분석 도구를 선택하는 5가지 기준 35.1. 도구 35.2. Reverse Code Engineer 35.3. 좋은 분석 도구 선택의 5가지 기준 35.3.1. 도구 개수를 최소화한다. 35.3.2. 도구는 기능이 단순하고 사용방법이 편리한 것이 좋다. 35.3.3. 기능을 철저히 익힌다. 35.3.4. 꾸준히 업데이트한다. 35.3.5. 도구의 핵심 동작 원리를 이해한다. 35.4. 숙련도의 중요성 5부 64비트 & Windows Kernel 6 36장 64bit Computing 36.1. 64비트 컴퓨팅 환경 36.1.1. 64비트 CPU 36.1.2. 64비트 OS 36.1.3. Win32 API 36.1.4. WOW64 36.1.5. 실습 - WOW64Test 36.2. 64비트 빌드 36.2.1. Microsoft Windows SDK(Software Development Kit) 36.2.2. Visual C++ 2010 Express 환경 설정 37장 x64 프로세서 이야기 37.1. x64에서 추가/변경된 사항 37.1.1. 64비트 37.1.2. 메모리 37.1.3. 범용 레지스터 in x64 37.1.4. CALL/JMP Instruction 37.1.5. 함수 호출 규약 37.1.6. 스택 & 스택 프레임 37.2. 실습 - Stack64.exe & Stack32.exe 37.2.1. Stack32.exe 37.2.2. Stack64.exe 37.2. 마무리 38장 PE32+ 38.1. PE32+ (PE+, PE64) 38.1.1. IMAGE_NT_HEADERS 38.1.2. IMAGE_FILE_HEADER 38.1.3. IMAGE_OPTIONAL_HEADER 38.1.4. IMAGE_THUNK_DATA 38.1.5. IMAGE_TLS_DIRECTORY64 39장 WinDbg 39.1. WinDbg 39.1.1. WinDbg 특징 39.1.2. WinDbg 실행 39.1.3. 커널 디버깅 39.1.4. WinDbg 기본 명령어 40장 64bit Debugging 40.1. x64 환경에서의 디버거 선택 627 40.2. 64비트 디버깅 628 40.2.1. 실습 예제 ? WOW64Test 40.3. PE32 : WOW64Test_x86.exe 40.3.1. EP 코드 40.3.2. Startup 코드 40.3.3. main( ) 함수 40.4. PE32+ : WOW64Test_x64.exe 40.4.1. System Breakpoint 40.4.2. EP 코드 40.4.3. Startup 코드 40.4.4. main( ) 함수 40.5. 마무리 41장 ASLR 41.1. Windows Kernel Version 41.2. ASLR 41.3. Visual C++ 41.4. ASLR.exe 41.4.1. 섹션 정보 41.4.2. IMAGE_FILE_HEADER \ Characteristics 41.4.3. IMAGE_OPTIONAL_HEADER \ DLL Characteristics 41.5. 실습 - ASLR 기능 제거 41.5.1. ASLR 기능 제거 42장 Session in Kernel 6 42.1. 세션 42.2. Session 0 Isolation 42.3. 보안 강화 43장 DLL Injection in Kernel 6 43.1. DLL 인젝션 실패 재현 43.1.1. 소스코드 43.1.2. 인젝션 테스트 43.2. 원인 분석 43.2.1. 디버깅 #1 43.2.2. 디버깅 #2 43.3. 실습 - CreateRemoteThread ( ) 성공시키는 방법 43.3.1. 방법 #1 - CreateSuspended 파라미터 변경 43.3.2. 방법 #2 - 조건 분기 조작 43.4. 간단 정리 43.5. InjectDll_new.exe 43.5.1. InjectDll_new.cpp 43.5.2. 인젝션 실습 44장 InjDll.exe - DLL Injection 전용 도구 44.1. InjDll.exe 44.1.1. 사용방법 44.1.2. 사용 예 44.1.3. 주의사항 6부 고급 리버싱 45장 TLS Callback Function 45.1. 실습 #1 - HelloTls.exe 45.2. TLS 45.2.1. IMAGE_DATA_DIRECTORY[9] 45.2.2. IMAGE_TLS_DIRECTORY 45.2.3. 콜백 함수 주소 배열 45.3. TLS 콜백 함수 45.3.1. IMAGE_TLS_CALLBACK 45.4. 실습 #2 - TlsTest.exe 45.4.1. DLL_PROCESS_ATTACH 45.4.2. DLL_THREAD_ATTACH 45.4.3. DLL_THREAD_DETACH 45.4.4. DLL_PROCESS_DETACH 45.5. TLS 콜백 디버깅 45.6. 수작업으로 TLS 콜백 함수 추가하기 45.6.1. 실습 재료 45.6.2. 설계 45.6.3. PE 헤더 편집 45.6.4. IMAGE_TLS_DIRECTORY 구성 45.6.5. TLS 콜백 함수 프로그래밍 45.6.6. 최종 완성 45.7. 마무리 46장 TEB 46.1. TEB 46.1.1. TEB 구조체 정의 46.1.2. TEB 구조체 내용 46.1.3. 중요 멤버 46.2. TEB 접근 방법 46.2.1. Ntdll.NtCurrentTeb ( ) 46.2.2. FS 세그먼트 레지스터 46.3. 마무리 47장 PEB 47.1. PEB 47.1.1. PEB 접근 방법 47.1.2. PEB 구조체 정의 47.1.3. PEB 구조체 내용 47.2. PEB 중요 멤버 설명 47.2.1. PEB.BeingDebugged 47.2.2. PEB.ImageBaseAddress 47.2.3. PEB.Ldr 47.2.4. PEB.ProcessHeap & PEB.NtGlobalFlag 47.3. 마무리 48장 SEH 48.1. SEH 48.1.1. 기본 설명 48.2. SEH 예제 실습 #1 48.2.1. 일반 실행 48.2.2. 디버거에서 실행 48.3. OS의 예외 처리 방법 48.3.1. 일반 실행의 경우 예외 처리 방법 48.3.2. 디버깅 실행의 경우 예외 처리 방법 48.4. 예외 48.4.1. EXCEPTION_ACCESS_VIOLATION(C0000005) 48.4.2. EXCEPTION_BREAKPOINT(80000003) 48.4.3. EXCEPTION_ILLEGAL_INSTRUCTION(C000001D) 48.4.4. EXCEPTION_INT_DIVIDE_BY_ZERO(C0000094) 48.4.5. EXCEPTION_SINGLE_STEP(80000004) 48.5. SEH 상세 설명 48.5.1. SEH Chain 48.5.2. 함수 정의 48.5.3. TEB.NtTib.ExceptionList 48.5.4. SEH 설치 방법 48.6. SEH 예제 실습 #2 (seh.exe) 48.6.1. SEH 체인 확인 48.6.2. SEH 추가 48.6.3. 예외 발생 48.6.4. 예외 처리기 파라미터 확인 48.6.5. 예외 처리기 디버깅 48.6.6. SEH 제거 48.7. OllyDbg 옵션 설정 48.7.1. KERNEL32 예외 무시 48.7.2. 예외를 디버기에게 전달 48.7.3. 기타 예외 처리 48.7.4. 간단 실습 48.8. 마무리 49장 IA-32 Instruction 49.1. IA-32 Instruction 49.2. 용어 정리 49.2.1. Disassembler 49.2.2. Decompiler 49.2.3. Decompile 간단 소개 49.3. IA-32 Instruction Format 49.3.1. Instruction Prefixes 49.3.2. Opcode 49.3.3. ModR/M 49.3.4. SIB 49.3.5. Displacement 49.3.6. Immediate 49.4. Instruction 해석 매뉴얼 49.4.1. IA-32 Manuals 다운로드 49.4.2. Instruction 해석 메뉴얼 출력 49.5. Instruction 해석 실습 49.5.1. Opcode Map 49.5.2. Operand 49.5.3. ModR/M 49.5.4. Group 49.5.5. Prefix 49.5.6. 2바이트 Opcode 49.5.7. Displacement & Immediate 49.5.8. SIB 49.6. Instruction 해석 추가 연습 49.7. 마무리 7부 Anti-Debugging 50장 Anti-Debugging 50.1. 안티 디버깅 기법 50.1.1. 의존성 50.1.2. 다양한 기법 50.2. 안티 안티 디버깅 기법 50.3. 안티 디버깅 분류 50.3.1. Static Anti-Debugging 50.3.2. Dynamic Anti-Debugging 51장 Static Anti-Debugging 51.1. Static Anti-Debugging의 목적 51.2. PEB 51.2.1. BeingDebugged(+0x2) 51.2.2. Ldr (+0xC) 51.2.3. Process Heap(+0x18) 51.2.4. NtGlobalFlag(+0x68) 51.2.5. 실습 - StaAD_PEB.exe 51.2.6. 회피 방법 51.3. NtQueryInformationProcess ( ) 51.3.1. ProcessDebugPort(0x7) 51.3.2. ProcessDebugObjectHandle(0x1E) 51.3.3. ProcessDebugFlags(0x1F) 51.3.4. 실습 - StaAD_NtQIP.exe 51.3.5. 회피 방법 51.4. NtQuerySystemInformation ( ) 51.4.1. SystemKernelDebuggerInformation(0x23) 51.4.2. 실습 - StaAD_NtQSI.exe 51.4.3. 회피 방법 51.5. NtQueryObject ( ) 51.5.1. 실습 - StaAD_NtQO.exe 51.6. ZwSetInformationThread ( ) 51.6.1. 실습 - StaAD_ZwSIT.exe 51.6.2. 회피 방법 51.7. TLS Callback Function 51.8. ETC 51.8.1. 실습 - StaAD_FindWindow.exe 51.8.2. 회피 방법 51.9. 마무리 52장 Dynamic Anti-Debugging 52.1. Dynamic Anti-Debugging 코드의 목적 52.2. Exceptions 52.2.1. SEH 52.2.2. SetUnhandledExceptionFilter( ) 52.3. Timing Check 52.3.1. 시간 간격 측정 방법 52.3.2. RDTSC 52.4. Trap Flag 52.4.1. Single Step 52.4.2. INT 2D 52.5. 0xCC Detection 52.5.1. API Break Point 52.5.2. Checksum 비교 52.6. 마무리 53장 Advanced Anti-Debugging 53.1. 고급 안티 디버깅 기법 53.2. 가비지 코드 53.3. Breaking Code Alignment 53.4. Encryption/Decryption 53.4.1. 간단한 디코딩 코드의 경우 53.4.2. 복잡한 디코딩 코드의 경우 53.4.3. 특수한 경우 - 코드 재조합 53.5. Stolen Bytes(Remove OEP) 53.6. API Redirection 53.6.1. 원본 코드 53.6.2. API Redirection 예제 #1 53.6.3. API Redirection 예제 #2 53.7. Debug Blocker(Self Debugging) 53.8. 마무리 8부 디버깅 실습 54장 디버깅 실습1 - 서비스 54.1. 서비스 프로세스 동작 원리 54.1.1. 서비스 제어기 54.1.2. 서비스 시작과정의 이해 54.2. DebugMe1.exe 예제 설명 54.2.1. 서비스 설치 54.2.2. 서비스 시작 54.2.3. 소스코드 54.3. Service 프로세스의 디버깅 이슈 54.3.1. 문제는 SCM 54.3.2. 디버거로 안 되는 것은 없다 54.3.3. 정석대로 해보자 54.4. 서비스 디버깅 실습 54.4.1. 그냥 디버깅 - EIP 강제 셋팅 54.4.2. 서비스 디버깅의 정석 - Attach 방식 54.5. 마무리 55장 디버깅 실습2 - Self Creation 55.1. Self-Creation 55.2. 동작 원리 55.2.1. Create Child Process(SUSPEND mode) 55.2.2. Change EIP 55.2.3. Resume Main Thread 55.3. 예제 소스코드 설명 55.4. 디버깅 실습 55.4.1. 고려 사항 55.4.2. JIT(Just-In-Time) Debugging 55.4.3. DebugMe2.exe 55.5. 마무리 56장 디버깅 실습3 - PE Image Switching 56.1. PE Image 56.2. PE Image Switching 56.3. 예제 파일 - Fake.exe, Real.exe, DebugMe3.exe 56.4. 디버깅 1 56.4.1. Open - 실행 파라미터 입력 56.4.2. main( ) 56.4.3. SubFunc_1 ( ) 56.4.4. CreateProcess(“fake.exe”, CREATE_SUSPENDED) 56.4.5. SubFunc_2 ( ) 56.4.6. SubFunc_3 ( ) 56.5. 디버깅 2 56.5.1. 아이디어 56.5.2. EP에 무한루프 설치하기 56.6. 마무리 57장 디버깅 실습4 - Debug Blocker 57.1. Debug Blocker 57.2. 안티 디버깅 특성 57.2.1. 부모 - 자식 관계 57.2.2. 디버기 프로세스는 다른 디버거(예: OllyDbg)에서 디버깅을 할 수 없습니다. 57.2.3. 디버거 프로세스를 종료하면 동시에 디버기 프로세스도 종료됩니다. 57.2.4. 디버거에서 디버기의 코드를 조작합니다. 57.2.5. 디버기의 예외(Exception)를 디버거에서 처리합니다. 57.2. 디버깅 실습 - DebugMe4.exe 57.3. 1차 시도 57.3.1. 디버깅 시작 위치 선정 57.3.2. main( ) 57.4. 2차 시도 57.5. 3차 시도 57.6. 4차 시도 57.7. 5차 시도 57.7.1. System Break Point 57.7.2. EXCEPTION_ILLEGAL_INSTRUCTION (1) 57.7.3. EXCEPTION_ILLEGAL_INSTRUCTION (2) 57.8. 6차 시도 57.8.1. 40121D (첫 번째 예외) 57.8.2. 401299 (두 번째 예외) 57.9. 7차 시도 57.9.1. Static 방법 57.9.2. Dynamic 방법 57.10. 마무리 책을 마치며 1. 창의성과 경험(바둑과 장기 - 프로그래밍과 리버싱) 바둑과 장기 프로그래밍과 리버싱 2. 독자님들께… |
|
리버서라면 꼭 알아야 할 핵심 원리를 모두 담았다!
리버싱이란 프로그램의 내부를 깊이 들여다보고 조작할 수 있는 기법이다. 이는 우리가 흔히 사용하는 상용 프로그램 등에도 가능하기 때문에 해킹의 방법으로 응용될 수 있다. 하지만 역시 리버싱은 일명 ‘리버서’라 불리는 악성 코드 분석가들의 특기이기도 하다. 무엇보다 리버싱 기법은 해커와 보안 전문가의 대결로만 이용되는 것은 아니다. 리버싱을 잘 활용하면 개발/테스트 단계에서 미처 발견하지 못한 버그나 취약점도 파악할 수 있고, 파일이나 메모리에 직접 접근하여 문제를 해결할 수 있다. 또한 전혀 새로운 기능을 추가해 프로그램의 기능을 향상시킬 수도 있어 매우 유용하다. 이 책은 이런 마법 같은 일들이 가능한 ‘리버싱’에 필요한 핵심 원리를 50여개 장을 통해 꼼꼼하게 설명한다. 무엇보다 저자가 오랫동안 안철수 연구소에서 경험을 토대로 직접 작성한 다양한 코드는 물론 리버서라면 꼭 알아야 할 다양한 리버싱 기법을 상세하게 소개하기 때문에 리버서를 꿈꾸는 개발자는 물론 실무를 경험해본 모두에게 도움을 준다. 무엇보다 이 책은 리버싱 기술과 그 동작 원리를 설명하는 데 집중한다. 즉 리버싱 기술의 단순한 소개에 그치지 않고, 각 기술의 핵심적인 원리를 깨닫게 하는 데 목표를 두고 있다. 이를 통해 기본기를 튼튼하게 다지는 것은 물론, 시간이 흘러도 가치가 변하지 않는 기술의 진수를 얻을 수 있다. 여러분이 리버싱 세계를 여행하고 싶다면, 이 책이 친근한 가이드가 되어 줄 것이다! 주요 내용 IA-32 Register 디버깅 크랙 PE File Format 실행 압축 Base Relocation Table 인라인 패치 실습 Windows 메시지 후킹 DLL Injection DLL Ejection Code Injection API 후킹 ‘스텔스’ 프로세스 글로벌 API 후킹 64bit Computing ASLR Session in Kernel 6 TEB PEB SEH IA-32 Instruction 안티 디버깅 |