리버싱과 시스템 해킹에 대한 기본을 탄탄히 다지는 책!
이 책은 리버싱의 기초적인 개념을 설명하고, 윈도우즈 환경에서 리버싱 기법을 설명한다. 그리고 시스템 해킹의 원리와 악성코드의 분석 과정을 설명한다. 악성코드 분석과 시스템 해킹의 원리를 파악하기 위해서는 리버싱 기법을 익히고 시스템 동작의 원리를 파악하는 것이 중요하다. 특히 시스템의 스택, 데이터, 힙 메모리에서 값을 오염시키는 공격 행위가 이루어지는 과정을 설명하도록 노력하였다. 본문 내의 설명과 예제들을 통해 리버싱과 해킹의 기본을 탄탄히 다질 수 있다.
차근차근 원리 위주의 설명, 쉬운 예제들
리버싱이나 시스템 해킹에 대한 책은 많이 나와 있다. 기초 수준으로 풀어서 설명되어 있는 것도 있고, 꽤 난이도가 있는 내용을 다루는 것도 있다. 중요한 것은 악성코드 분석과 시스템 해킹을 수행하기 위해서는 리버싱 기술이 필수적이라는 점이다. 그러나 이러한 부분을 모두 다루고 있으면서, 독자들의 수준에 맞게 설명된 책은 찾기 어렵다. 더구나 기존의 책에서 다루는 예제 코드는 특정 환경에서만 동작되는 경우도 허다하다. '실행파일'이란 결국 운영체제 환경에 영향을 받기 때문에 만약 실습환경이 바뀌면 원하는 결과를 얻지 못할 수도 있게 된다. 즉 이전 버전에서 가능했던 방법이 다음 버전에는 불가능한 경우가 많다. 이러한 결과로 독자들이 실습할 때 책의 내용과 다른 결과에 당황하는 상황이 발행하게 된다. 이 때문에 이 책에서는 소스 형태로 프로그램을 제공하고 원리 위주로 풀어서 설명하려고 노력하였다.
김민수
한국인터넷진흥원(KISA) 선임연구원, 전남대학교 시스템보안연구센터 연구교수를 거쳐 현재 국립목포대학교 정보보호학과 교수로 해킹과 바이러스, 침입탐지와 차단, 운영체제, 시스템 프로그래밍 등을 강의하고 있으며 정보보안 관리실태 평가위원, 정보보호 및 개인정보 관리체계(ISMS-P) 인증위원, 한국정보보호학회 이사 및 논문지 편집위원 한국정보기술학회 이사로 활동 중이다.
CHAPTER 01 리버싱과 해킹의 이해
1.1 해킹의 이해
1.1.1 해커의 의미
1.1.2 해킹 학습 방법
1.1.3 해킹의 절차
1.2 리버스 엔지니어링
1.2.1 리버싱 적용 분야
1.2.2 리버싱 방법
1.2.3 리버싱의 위험도
CHAPTER 02 컴퓨터 시스템의 명령어 처리 구조
2.1 데이터 표현 방식
2.1.1 데이터 표현 단위
2.1.2 숫자의 표현
2.1.3 문자의 표현
2.2 프로그램의 생성
2.2.1 프로그램의 생성
2.2.2 컴파일러의 역할
2.3 프로세스
2.3.1 프로세스 상태
2.3.2 프로세스의 실행
2.3.3 프로세스 실행정보의 확인
2.4 레지스터의 구성과 역할
2.4.1 레지스터 종류
2.4.2 컴퓨터 명령어 코드
CHAPTER 03 디버거의 활용 방법
3.1 프로그램 디버깅
3.1.1 프로그래밍 오류
3.1.2 프로그래밍 오류가 자주 발생하는 지점
3.1.3 프로그래밍 오류 찾기
3.2 디버거 종류
3.3 디버거 사용법(x64dbg)
3.3.1 x64dbg 설치하기
3.3.2 x64dbg 주요 기능
3.3.3 디버거를 사용하여 프로그램 따라가기
3.3.4 원하는 코드 위치로 찾아가는 방법
CHAPTER 04 어셈블리어의 이해
4.1 어셈블리어 명령어
4.2 프로그램 코드의 어셈블리어 표현
4.2.1 어셈블리어 코드의 이해
4.2.2 디컴파일러 기능 활용
CHAPTER 05 코드 분석과 패치
5.1 문자열 패치
5.1.1 문자열 패치 방법
5.1.2 원본보다 더 긴 문자열 패치
5.1.3 메모리 변경 내용을 파일로 보관
5.2 코드 패치
5.2.1 제어 흐름 찾아가기
5.2.2 제어 흐름의 변경
5.2.3 패치 공간의 부족
5.3 실행 파일의 코드 분석 연습
5.3.1 패스워드 찾기
5.3.2 시리얼번호 찾기
5.3.3 리버싱 문제 풀이
CHAPTER 06 윈도우 실행 파일 구조
6.1 윈도우 PE 파일
6.1.1 윈도우 PE(Portable Executable) 파일이란?
6.1.2 PE 파일 관련 도구
6.2 윈도우 PE 파일 구조
6.2.1 윈도우 실행 파일 형식
6.2.2 MS-DOS 정보
6.2.3 Windows NT 정보
6.2.4 섹션 정보
6.2.5 메모리 로딩 시 주소 변환
6.3 IAT(Import Address Table)
6.4 EAT(Export Address Table)
CHAPTER 07 파일 패킹과 언패킹
7.1 PE 파일 패킹(packing)
7.1.1 패커의 주요 기능
7.1.2 패커 종류
7.1.3 UPX 패커
7.1.4 패킹의 증상
7.1.5 패커 시그니처 탐지
7.2 PE파일 언패킹(unpacking)
7.2.1 언패킹의 목표
7.2.2 언패킹 방법
7.2.3 도구를 이용한 자동 언패킹
7.3 수동 언패킹(manual unpacking)
7.3.1 UPX 패커의 언패킹 과정 디버깅
7.3.2 디버거와 IAT 복구 도구를 이용한 수동 언패킹
CHAPTER 08 안티 리버싱
8.1 디버거 탐지
8.1.1 프로세스 정보 확인
8.1.2 디버깅 관련 API 활용
8.1.3 중단점 탐지
8.2 난독화(Obfuscation)
CHAPTER 09 메모리 오염 공격
9.1 시스템 메모리
9.1.1 시스템 메모리 영역
9.1.2 함수 호출 시의 스택 구조
9.1.3 버퍼 오버플로우
9.1.4 포맷 문자열
9.2 스택 오버플로우 공격
9.2.1 스택 오버플로우
9.2.2 스택 오버플로우 공격 실습
9.2.3 공격 코드 작성
9.3 데이터 공간 오버플로우 공격
9.3.1 힙 오버플로우
9.3.2 데이터 공간의 오버플로우 공격
9.4 UAF 공격
9.4.1 힙 메모리 영역 관리 방법
9.4.2 UAF(Use After Free) 공격
CHAPTER 10 방패와 창
10.1 스택 오버플로우 공격의 특징
10.2 데이터 공간 실행 방지
10.2.1 DEP(Data Execution Protection) 기능
10.3 데이터 공간 오염 방지
10.3.1 카나리아(Canary) 기능
10.3.2 ASLR(Address Space Layout Randomization)
10.4 공격 방지 기법의 회피 방법
10.4.1 RTL(ReturnToLibrary)
10.4.2 ROP(Return Oriented Programming)
10.4.3 ASLR 우회
CHAPTER 11 코드 인젝션
11.1 PE 재배치와 코드 패치 원리
11.1.1 PE 재배치(relocation)
11.1.2 재배치 정보
11.1.3 PE 코드 패치
11.2 코드 인젝션(Code Injection)
11.2.1 코드 인젝션 정의
11.2.2 코드 인젝션 주요 동작 흐름
11.2.3 코드 인젝션 관련 주요 API 정보
11.2.4 API 후킹
11.3 DLL 인젝션
11.3.1 DLL 영역
11.3.2 SetWindowHookEx()를 이용한 DLL 인젝션
11.3.3 원격 쓰레드를 이용한 DLL 인젝션
11.4 쓰레드 인젝션(Thread Injecrion)
11.4.1 CreateRemote Thread() API를 이용한 쓰레드 인젝션
11.4.2 쓰레드 EIP 변경을 이용한 쓰레드 인젝션
11.4.3 스텁 코드 삽입
11.5 프로세스 인젝션(Process Injection)
11.5.1 프로세스 할로잉
11.5.2 프로세스 도플갱잉
CHAPTER 12 악성코드 분석
12.1 악성코드 분석 준비
12.1.1 정적 분석 도구
12.1.2 동적 분석 도구
12.1.3 상세 분석 도구
12.2 악성코드 샘플 분석
12.2.1 정적 분석 진행
12.2.2 동적 분석 진행
12.2.3 상세 분석 진행
12.2.4 안티 디버깅과 안티 가상화
12.2.5 인코딩된 PE 바이너리 얻어 오기
12.3 정보 유출형 악성코드
12.3.1 정적 분석하기
12.3.2 동적 분석하기
12.3.3 상세 분석하기
12.3.4 악성코드 분석할 때 주의사항
어렵지 않은 리버싱, 손에 잡히는 시스템 해킹
이 책은 리버싱의 기초적인 개념을 설명하고, 윈도우즈 환경에서의 리버싱 기법을 설명한다. 가장 기초가 되는 리버싱에 대한 이해와 함께, 각각의 리버싱 기법들, 그리고 각종 ‘악성코드’들을 직접 분석해 보기도 한다. 이 과정들에서 모든 설명들은 어렵지 않게, 또한 손쉬운 예제들을 통해서 하나씩 진행된다. 이러한 내용들은 저자가 투여한 1년여의 집필 시간, 그리고 많은 강의들을 통해 학습자와의 시각 차이를 좁혀온 결과이기도 하다.
내용을 학습해 나가면서, 각각의 기법들을 차근차근 익혀나간다면 리버싱과 시스템 해킹에 대한 탄탄한 기본기를 갖추게 될 것이다.