CodeEngn Logo

Book


국내 리버스엔지니어링 관련 서적을 쉬어가기, 초급, 중급, 고급으로 분류 하였습니다.

추가 및 변경 신청은 Contact 메뉴에서 요청 해주세요.



리버스 엔지니어링 바이블 : 코드 재창조의 미학


정보

저자 : 강병탁
출판사 : 위키북스
출간일 : 2012년 09월 20일
페이지 : 616
ISBN-13 : 9788998139018
ISBN-10 : 8998139014
정가 : 38,000원


책소개

리버스 엔지니어링만을 위한 바이블, 리버싱의 모든 것이 이 책 한 권에 녹아 있다 『리버스 엔지니어링 바이블: 코드 재창조의 미학』은 이 같이 해커들이 주고받던 어둠의 지식을 수면 위로 끌어올리는 역할을 한다. 많은 사람들이 리버스 엔지니어링에 대해 깊이 있는 지식을 만나지 못하고 마약을 밀매하듯 은밀하게 기법을 주고받았지만, 이제 이 책을 통해 그 모든 목마름에 대한 해답을 찾을 수 있다. C/C++ 코드가 어셈블리 코드로 어떻게 변해가는지에 대한 기초적인 부분에서부터, 보안 프로그램 공격 방법, 리버싱 보조 플러그인 개발 방법, 그리고 소스코드가 없는 상태에서 프로그램을 커스터마이징하는 방법까지, 리버스 엔지니어링에 관련된 모든 사항을 다룬다.


저자소개

강병탁

window31이라는 닉네임으로 활동하며, 월간 마이크로소프트에서 약 3년간 리버스 엔지니어링, 악성코드 등 해킹/보안 관련 기고물을 연재했다. 국방부, KISA, 침해사고대응협의회, 고려대, 카이스트, 홍익대 등에서 수차례에 걸쳐 리버스 엔지니어링에 대한 공개 강의를 진행했다. 국내에서는 최초로 Developer Security 분야에서 마이크로소프트 MVP를 수상했으며, 보안 블로그 Broken Code(www.window31.com)를 운영하며 각종 해킹/보안 테크니컬 칼럼을 작성하고 있다. 고려대학교 해킹대응연구실 소속으로 정보보호학을 공부했으며, (주)잉카인터넷 재직 시절에는 온라인 게임보안 솔루션인 nProtect GameGuard의 Lead Programmer, 넥슨 코리아에서는 게임보안팀 팀장으로 재직했다, 현재는 넥슨 아메리카 정보보안팀 팀장으로, 미국 지사의 보안업무를 담당하고 있다.


목차

[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 호출 감추기 
난독화 코드 찾아내어 우회하기 
마무리

Linode is a privately owned virtual private server provider based in Galloway, New Jerse