이미 소장하고 있다면 판매해 보세요.
|
[01부] 리버스 엔지니어링 기본
▣ 01장_리버스 엔지니어링만을 위한 어셈블리 어셈블리의 기본 구조 어셈블리의 명령 포맷 레지스터, 복잡한 설명은 그만 EAX EDX ECX EBX ESI, EDI 외울 필요가 없는 어셈블리 명령어 - PUSH, POP - MOV - LEA - ADD - SUB - INT - CALL - INC, DEC - AND, OR, XOR - NOP - CMP, JMP 리버스 엔지니어링에 필요한 스택 함수의 호출 리턴 주소 ▣ 02장_C 문법과 디스어셈블링 함수의 기본 구조 함수의 호출 규약 - 1) _cdecl 방식 - 2) 파라미터는 2개 - 3) 리턴 값이 숫자 if 문 반복문 구조체와 API Call 결론 ▣ 03장_C++ 클래스와 리버스 엔지니어링 C++ 분석의 난해함 클래스 뼈대 클래스의 수명과 전역변수 객체의 동적 할당과 해제 생성자와 소멸자 캡슐화 분석 다형성 구조 파악 ▣ 04장_DLL 분석 DLL의 번지 계산법 재배치를 고려한 방법 - 1) push 문 - 2) 점프문 번지 고정 익스포트 함수 DllAttach/DllDetach 찾기 패킹된 DLL의 DllMain() 찾기 DisableThreadLibraryCalls로 찾기 [02부] 리버스 엔지니어링 중급 ▣ 05장_PE 헤더(PE Header) PE에 대한 상식적인 개념 빌드 과정 PE 파일 구조 - IMAGE_DOS_HEADER - IMAGE_NT_HEADER - IMAGE_FILE_HEADER - Machine - NumberOfSections - TimeDateStamp - SizeOfOptionalHeader IMAGE_OPTIONAL_HEADER - Magic - SizeOfCode - MajorLinkerVersion, MinorLinkerVersion - ImageBase - AddressOfEntryPoint - BaseOfCode - SectionAlignment, FileAlignment; - SizeOfImage - SizeOfHeaders - Subsystem- - - - - - - : 0x2 (Windows GUI) - DataDirectory IMAGE_SECTION_HEADER PE와 API 호출의 원리 IAT에서 API를 계산하는 방법 익스포트 테이블 (export table) 마무리 ▣ 06장_흔히 사용하는 패턴 조건문의 기본 심화된 조건문 반복문 break가 들어가는 경우 continue가 들어갈 경우 return이 생기는 경우 문자열 컨트롤 - 1. strcpy - 2. strcat - 3. strlwr 정리 ▣ 07장_MFC 리버싱 리버스 엔지니어링에 필요한 MFC 구조 MFC로 개발됐는지 여부 확인 MFC 라이브러리 등록 MFC 초기화 루틴 찾기 버튼 핸들러 찾아내기 헤더 파일 활용 그 밖의 MFC 관련 리버싱 접근 방법 [03부] 연산 루틴 리버싱 ▣ 08장_시리얼 추출 방법 F-Secure Reverse Engineering 대회 Level 1 문제 풀이 - 1) 사전 정보 획득 첫 번째 ? 파일 스캐너로 스캔 - 2) 사전 정보 획득 두 번째 ? API 확인 - 3) 사전 정보 획득 세 번째 ? 파일의 이미지 베이스 확인 Level 2 문제 풀이 문자열 컨트롤 안티 디버깅 기법 WinMain보다 먼저 가동되는 코드 ▣ 09장_코드 속이기 Level 3 문제 풀이 데이터 속에 숨은 코드 리버싱으로 방정식 세우기 바이너리 파싱 재사용이 어려운 코드 디스어셈블러 속이기 정리하며 [04부] 안티 리버스 엔지니어링 ▣ 10장_교과서적인 안티 디버깅 프로그램 개발 완료 후 다가올 리버싱의 위험 리버싱에 대항하는 A씨의 반격, 그 후… 안티 디버깅이란? 고전적인 안티 디버깅 API 로 제공되는 안티 디버깅 기능 다중 기능을 보유한 맥가이버칼, NtQueryInformationProcess Debug Object Handle 또 핸들을 찾아라, NtQueryObject NoDebugInherit 디버거는 어디에, NtSetInformationThread int3을 이용한 디버거 감지 SetUnhandledExceptionFilter 0xCC 자체를 탐지하자 소프트아이스 감지 PEB를 이용한 방법 정리 ▣ 11장_한 단계 높은 안티 디버깅 생각보다 활용도가 높은 프로세스 체크 버전 체크 부모 프로세스 체크 SeDebugPrivilege 권한 체크 WinDBG 검출 키보드 입력 봉쇄 CloseHandle()을 이용한 안티 리버싱 OutputDebugString이 주는 두 가지 마술 시간차 공격! 타이머를 이용한 방법 PREFIX REP을 통한 예외 처리 API Hook을 이용한 디버깅 감지 리모트 디버깅 감지 생각해 볼 과제 ▣ 12장_패커가 사용하는 기술 패커? 대수롭지 않은 개념 패킹된 코드의 암호화/복호화 IAT의 변화 매뉴얼 언패킹(MUP) 파일 스캐너 디버거의 구조 Self Debugging 스택 세그먼트 레지스터 int 0x2d 덤프 방지 디버그 레지스터 ▣ 13장_우회 방법 API Hooking을 통한 우회 OllyDBG 옵션을 이용한 우회 플래그 수정으로 우회 [05부] OllyDBG 플러그인 ▣ 14장_OllyDBG 플러그인 SDK 최고의 매력 OllyDBG 플러그인 플러그인 가동 원리 플러그인 SDK 사용 규약 초기화 코드 PreInit - ODBG_Plugindata() 초기화 루틴 - ODBG_Plugininit() 메뉴 작성 - ODBG_Pluginmenu() 메뉴 핸들러 작성 - ODBG_Pluginaction() 종료 처리 PDK 활용 t_dump - 덤프 관련 구조체 t_memory ? 메모리 관련 구조체 t_disasm ? 디스어셈블 구조체 Readmemory 구조체 종합 예제 - Extra Copy ▣ 15장_리버싱 보조 플러그인 IsDebuggerPresent() 무력화 디버거 떼어내기 자동 어태치 단축키 - ODBG_Pluginshortcut() OllyAdvance 분석 Setbreakpoint()와 TLS CallBack 감지 커맨드라인 실행 바 디버깅 흔적 청소 게임 해킹 플러그인 ? Game Invader Game Invader의 구현 원리 메모리 속성 옵션 암복호화 코드 분석 ? Find Crypt FindCrypt의 구현 원리 남은 과제 ▣ 16장_메모리 스캔 플러그인 개발 아직 세상에 없는 플러그인을 만들어 보자 분석 시간을 줄일 수 있다면? 플러그인 코어 루틴 컨셉 UI 디자인 버튼 핸들러 제작 후킹 탐지 기능 파일과 메모리의 기준 번지를 정하는 방법 IAT가 코드 섹션에 포함된 경우 패킹 체크 후킹 탐지 스캔 결과 암복호화 루틴 탐지 화이트 리스트 처리 OllyMemScan 평가 [06부] 보안 모듈 우회 ▣ 17장_바이러스 감지 회피 백신은 과연 바이러스만 감지하는가 기본적인 감지 원리 고전적인 우회 방법 쓰레기 코드를 통한 우회 방법 실행조차 되지 않는 코드 헤더 변조 문자열 패턴 우회 바이너리 패킹의 시대 대체 가능한 어셈블리어 패커의 특성을 고려한 회피 섹션 이름 변경 백신사의 대응 ▣ 18장_백신을 공격하는 악성코드 백신을 공격하는 바이러스는 어느 정도 존재하는가 특정 백신 언급 증가 백신 프로세스 종료 트레이 속임 공식적으로 언급된 취약점 업데이트 우회 보안업체 비방 드라이버 공격 몸체가 없는 공격 코드 Conficker SDT 취약점 벤치마킹의 중요성 ▣ 19장_실시간 감시 기능 취약점 바이러스 감지 후 필요한 행위 파일 시스템 필터 드라이버 실시간 감시 기능의 구현 원리 콜백 함수 무력화 콜백 무력화 대응 방법 노티파이 카운트 취약점 화이트리스트 강제 주입 파일 접근 통제 ZIP 취약점 가상 PC 감지 그외 안티바이러스 우회를 위한 다양한 방법 ▣ 20장_키보드 보안 솔루션 우회 키보드 취약점이 되는 구간 키보드 보안의 원리 폴링 취약점 IE 의 추가 기능 관리 가장 피해 사례가 많은 ring3 영역 핵심 모듈 공격 언로드 DLL ring3에서 키보드 보안을 우회하는 이유 키보드 보안의 문제점 가상 키보드 취약점 인터넷 뱅킹 취약점 ? 메모리 해킹 키보드 보안이 어려운 이유 클라이언트에서 완전한 보안은? [07부] 한 차원 높은 바이너리 창조 ▣ 21장_코드 후킹 코드 후킹과 공동경비구역 번지 계산의 고통 DLL 인젝션 코드 CreateRemoteThread DLL 인젝션 테스트 코드 후킹 기본 디자인 여섯 바이트를 변조하는 이유 DLL 번지의 강제 고정과 naked 함수 패킷 버퍼 로깅 하드코딩에서 탈피하자 후킹 코드의 확장 MakeJMP - 후킹 함수의 간결화 마무리 ▣ 22장_코드 패칭 동적 접근 방법과 정적 접근 방법 프로세스 검출 루틴 분석 점프문 공격 파일에서 패칭할 때와 메모리에서 패칭할 때 상수값 패칭 스택 해킹 거짓을 리턴 스레드 공격 마무리 ▣ 23장_난독화와 더미 코드 디스어셈블러 개론 안티 디스어셈블링 가비지 코드 속에 담긴 진짜 코드 ASPack이 사용하는 안티 디스어셈블링 Themida에서 사용하는 안티 디스어셈블링 ASProtect 의 코드 카피 Themida의 코드 리다이렉트 상수 암호화 API 호출 감추기 난독화 코드 찾아내어 우회하기 마무리 |
|
정보보안의 태동기에는 네트워크 보안, 시스템 보안 두 영역에서 방화벽과 같은 네트워크 단에서의 필터링 기술과, OS 단에서의 아주 기본적인 요소기술이 발전했었다. 그 뒤 나온 보안기술들을 보더라도 네트워크 기반 침입탐지시스템(N-IDS), 침입방지시스템(IPS), 웹애플리케이션방화벽(WAF)과 같이 주로 이미 발생해서 인스턴스화된 공격에 대해 탐지와 예방을 하는 것들이 주류를 이뤘다. 예전부터 개념 역시 존재했고 소수 기업 및 인원들에 의해 이뤄지고는 있었지만, 이미 개발된 프로그램 그 자체에 대한 취약점을 발견해 내기 위해 시큐어코딩이나 개발보안에 사람들이 관심을 갖고 노력을 하기 시작한 것은 사실 10년도 채 되지 않았다고 볼 수 있다.
보안산업 역시 고도화 되어가는 과정에서 나타나는 현상 중 하나로, 일단 기본적인 기술들이 먼저 발전한 뒤에야, 특화된 영역에 대한 요소기술로 깊이 연구가 이뤄지게 된다. 전통적인 네트워크 보안 영역에 쏠렸고(Firewall, N-IDS), 그 후 OS 영역(H-IDS, SecureOS)에 주 초점이 맞춰져 있었다가, DB/Application 영역 (DB보안, 웹보안 및 시큐어코딩 등의 개발보안)으로 관심사가 옮겨가면서 리버스 엔지니어링 기술의 중요성은 두말할 나위 없이 보안 분야 종사가 반드시 갖춰야 할 기술로 자리 잡았다. 다양한 보안직군 가운데 모의해킹, 취약점분석을 주로 하거나 또는 악성코드 분석 또는 안티 리버스 엔지니어링(Anti-Reverse Engineering)을 통해 보안을 강화하고자 한다면 리버스 엔지니어링 관련 지식을 꼭 쌓을 것을 권하고 싶다. 리버스 엔지니어링 지식과 더불어 Solaris, HP-UX, AIX, Linux, FreeBSD와 같은 다양한 OS를 다뤄보고 각 환경에서의 프로그래밍 스킬을 함께 익힌다면 보안 분야에서 “자신만의 고유한(unique) 능력을 갖춘 대체 불가능한(irreplaceable) 인재"로 성장하리라 확신한다. 이 책은 리버스 엔지니어링에 대해 충실히 다룰 뿐 아니라, 익힌 리버스 엔지니어링 기법을 실제로 어떤 곳에 활용할 수 있는지에 대해서도 상세히 다룬다. 그간 저자가 오랜 기간 동안 시행착오를 겪으면서 익힌 소중한 지식을, 그다음에 배우는 사람들은 실수와 시행착오를 최소한으로 하고 배울 수 있게 여기저기에 배려하고 있으며, 복잡하고 어렵기만 한 내용을 편안하게 전달하는 저자 특유의 노하우가 담겨 있다. ----감수자의 글 중에서 |
|
이 책은 리버스 엔지니어링을 처음 접하거나 어느 정도 수준을 높이고자 하는 독자를 대상으로 한다. 특히 친근한 설명과 가벼운 대화체를 사용했으므로 접근하는 데 벽이 높지 않으리라 생각한다. 따라서 리버스 엔지니어링이 너무 어려워서 중도에 포기했던 독자라면 많은 도움이 될 것이다.
이 책은 총 7부로 구성돼 있으며, 각 부별 주요 내용은 아래와 같다. ▣ [1부] 리버스 엔지니어링 기본 어셈블리, C, C++, DLL 등의 매우 기본적인 코드의 생성 흐름과 규칙을 정리한 내용이다. 리버스 엔지니어링도 결국 정해진 문법 안에서 기본적인 규칙을 따르면 풀어낼 수 있는 것에 불과하기 때문에 그러한 규범을 알아보자는 이야기라고 보면 될 것 같다. 차를 달이거나 마실 때의 방식이나 규칙을 말하는 다도(茶道)라는 것이 있다. 한 잔에 불과한 맹물을 마실 때도 이 같은 엄격한 규율이 있듯이 리버스 엔지니어링을 할 때도 기본적으로 알아둬야 할 규칙이 있다는 것을 이해하기 위한 내용이다. ▣ [2부] 리버스 엔지니어링 중급 PE Header는 리버스 엔지니어링을 공부하는 사람들이 가장 고통스러워 하기도 하면서 공부하기도 싫어했지만 어쩔 수 없이 결국에는 익혀야만 되는 필수 요소 중 하나인데, 그런 선배 경험자들의 고충을 밑바탕으로 이론에 불과한 내용을 철저히 배제하고 현업과 실무에 맞게 재각색해서 설명했다. “2장 흔히 사용하는 패턴”에서는 1부 리버싱 기본에서 다루지 못한 코드가 생성되는 과정과 계속 반복해서 나오는 패턴에 대해 분석하며 어셈블리 언어의 감을 익히기 위한 내용을 준비했다. 그리고 마지막으로 MFC 리버싱을 통해 애플리케이션 분석의 집중도를 높일 수 있게 여러 가지 기법 소개를 준비했다. ▣ [3부] 연산 루틴 리버싱 F-Secure 백신사의 리버스 엔지니어링 대회를 통해 연산 루틴을 분석하는 과정을 설명하는데, 흔히 볼 수 있는 점프 패치를 중점적으로 설명하기보다는 왜 이 루틴을 분석해야 하고 어떤 접근 방식을 써야 하는지 등, 생각하는 리버스 엔지니어링에 초점을 맞춰 단순한 키 빼내기 해설이 되지 않도록 노력했다. ▣ [4부] 안티 리버싱 안티 리버싱은 리버스 엔지니어링을 막는 기술, 이른바 밤송이에 돋은 가시 같은 역할이다. 이것을 제거해야만 리버스 엔지니어링을 순탄하게 진행할 수 있고 결국에 알밤을 빼먹을 수 있는 결과까지 도달하는 것이다. 안티 리버싱 기술은 계속해서 발전을 거듭해, 안티 리버싱을 분석, 격파하는 그 자체가 하나의 학문으로 될 만큼 성장해오고 있다. 인터넷에 흔히 등장하는 안티 디버깅 코드는 실제로 가동되지 않는 것도 많고 예제 코드도 충분하지 않아 익히기에 어려운 감이 있지만 이 4부에서는 모든 기법을 100% 실제 코드로 제작했으며 각 밤송이 가시 기술에 대한 강력함의 정도, 우회 방법 등의 한계점, 그리고 보완 방법 등에 대해 다각도로 설명한다. ▣ [5부] OllyDBG 플러그인 OllyDBG 플러그인은 리버스 엔지니어링을 좀 더 쉽게 하기 위해 만든 보조 도구라고 볼 수 있다. OllyDBG에서는 누구나 플러그인을 제작할 수 있게 훌륭한 인터페이스를 제공하고 있으므로 SDK의 사용법과 자신만의 아이디어가 결합하면 리버스 엔지니어링을 몇 배 이상 효율적으로 증가시킬 플러그인을 제작할 수 있다. ▣ [6부] 보안 모듈 우회 보안 관계자에게 가장 두려운 것은 방어장치가 없는 상태에서 해킹을 하는 사람이 아니고 존재하는 보안 모듈을 뚫어서 해킹 시도를 하는 이들이다. 그리고 대부분의 취약점은 보안 설계 자체의 실수보다는 어이없는 한두 줄의 취약점 때문에 발생하는 것들이 상당수를 이룬다. 6부에서는 일반적으로 보안 모듈을 우회하는 기법 말고도 굉장히 단순한 한두 가지 취약점을 이용해 보안 모듈이 공격 당하는 여러 가지 사례를 보여준다. ▣ [7부] 한 차원 높은 바이너리 창조 7부에서는 마지막 내용으로, 코드 후킹, 코드 변조, 난독화 등의 내용을 다루며 중급 이상의 리버스 엔지니어링을 목표로 하는 독자를 위해 작성했다. eax는 리턴값, ecx는 카운터라는 등의 시시껄렁하고 반복적인 지식의 답습에서 벗어나 리버싱의 깊이를 좀더 맛볼 수 있게 노력했다. “6부 보안 모듈 우회” 편의 연장이라는 느낌을 살렸기 때문에 6부의 내용을 반드시 숙지한 후에 살펴보길 바란다. |
|
리버스 엔지니어링만을 위한 바이블, 리버싱의 모든 것이 이 책 한 권에 녹아 있다!
리버스 엔지니어링은 소위 해커들의 전유물처럼 취급돼 왔다. 기술이 가지고 있는 위험성 때문에 수면 위로 올라오지 못하고 '어둠의 예술'이라고 불리며 그간 많은 사람들에게 정체가 가려져 있었다. 그래서 역사가 오래됐음에도 뚜렷한 전문서나 바이블이 존재하지 않으며, 인가된 해커들만 정보를 공유할 수 있거나 리버싱 업무를 수행하던 소수의 리서처에게 발품을 팔아 하나씩 배워야만 했다. 『리버스 엔지니어링 바이블: 코드 재창조의 미학』은 이 같이 해커들이 주고받던 어둠의 지식을 수면 위로 끌어올리는 역할을 한다. 많은 사람들이 리버스 엔지니어링에 대해 깊이 있는 지식을 만나지 못하고 마약을 밀매하듯 은밀하게 기법을 주고받았지만, 이제 이 책을 통해 그 모든 목마름에 대한 해답을 찾을 수 있다. C/C++ 코드가 어셈블리 코드로 어떻게 변해가는지에 대한 기초적인 부분에서부터, 실제 악성코드 분석, 보안 프로그램 공격 방법, 리버싱 보조 플러그인 개발 방법, 그리고 소스코드가 없는 상태에서 프로그램을 커스터마이징하는 방법까지, 리버스 엔지니어링에 관련된 모든 사항을 다룬다. ★ 이 책에서 다루는 내용 ★ ■ C/C++ 코드를 리버스 엔지니어링할 때에 접근 방법에 대한 노하우 ■ MFC나 Win32 API, 런타임 라이브러리 등 실제 모듈에 사용되는 코드 해석 방법 ■ 리버스 엔지니어링을 방해하기 위한 안티 리버싱 기술, 그리고 그것을 또 우회하는 방법 ■ 백신이나 보안 솔루션 등을 공격하는 기술, 바이러스 감지 회피의 원리 ■ 시리얼 연산 루틴을 리버스 엔지니어링 할 때의 테크닉, 크래킹 기법 ■ 소스가 없는 프로그램을 리버스 엔지니어링으로 커스터마이징하는 방법 ■ 키보드 보안 솔루션이나 실시간 감지 기술을 우회하는 과정 ■ 국내에서는 한 번도 다뤄지지 않는 Olly Debugger의 플러그인 개발 방법 |