서브메뉴
검색
본문
Powered by NAVER OpenAPI
-
리버스 엔지니어링 바이블 (코드 재창조의 미학)
저자 : 강병탁
출판사 : 위키북스
출판년 : 2014
정가 : 35000, ISBN : 9788998139728
책소개
『리버스 엔지니어링 바이블: 코드 재창조의 미학』은 이 같이 해커들이 주고받던 어둠의 지식을 수면 위로 끌어올리는 역할을 한다. 많은 사람들이 리버스 엔지니어링에 대해 깊이 있는 지식을 만나지 못하고 마약을 밀매하듯 은밀하게 기법을 주고받았지만, 이제 이 책을 통해 그 모든 목마름에 대한 해답을 찾을 수 있다. C/C++ 코드가 어셈블리 코드로 어떻게 변해가는지에 대한 기초적인 부분에서부터, 실제 악성코드 분석, 보안 프로그램 공격 방법, 리버싱 보조 플러그인 개발 방법, 그리고 소스코드가 없는 상태에서 프로그램을 커스터마이징하는 방법까지, 리버스 엔지니어링에 관련된 모든 사항을 다룬다.
목차
[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 호출 감추기
난독화 코드 찾아내어 우회하기
마무리