책 이미지
책 정보
· 분류 : 국내도서 > 컴퓨터/모바일 > OS/Networking > 네트워크 보안/해킹
· ISBN : 9791161755069
· 쪽수 : 616쪽
책 소개
목차
1부. BINARY FORMATS
1장. 바이너리란 무엇인가
1.1 C언어로 작성된 프로그램의 컴파일 과정
1.1.1 전처리 단계
1.1.2 컴파일 단계
1.1.3 어셈블 단계
1.1.4 링킹 단계
1.2 심벌과 스트립 바이너리
1.2.1 심벌 정보 확인하기
1.2.2 바이너리 스트립: 관련 정보 은닉하기
1.3 바이너리 디스어셈블
1.3.1 목적 파일
1.3.2 단독으로 실행가능한 바이너리 파일 분석하기
1.4 바이너리 로딩과 실행
1.5 이 장의 요약
연습 문제
2장. ELF 바이너리 포맷
2.1 ELF 파일 헤더
2.1.1 e_ident 배열
2.1.2 e_type, e_machine, e_version 필드
2.1.3 e_entry 필드
2.1.4 e_phoff와 e_shoff 필드들
2.1.5 e_flags 필드
2.1.6 e_ehsize 필드
2.1.7 e_*entsize 와 e_*num 필드
2.1.8 e_shstrndx 필드
2.2 섹션 헤더
2.2.1 sh_name 필드
2.2.2 sh_type 필드
2.2.3 sh_flags 필드
2.2.4 sh_addr, sh_offset, sh_size 필드
2.2.5 sh_link 필드
2.2.6 sh_info 필드
2.2.7 sh_addralign 필드
2.2.8 sh_entsize 필드
2.3 섹션
2.3.1 .init 과 .fini 섹션
2.3.2 .text 섹션
2.3.3 .bss, .data, .rodata 섹션들
2.3.4 지연 바인딩과 .plt, .got, .got.plt 섹션
2.3.5 .rel.* 과 .rela.* 섹션
2.3.6 .dynamic 섹션
2.3.7 .init_array와 .fini_array 섹션
2.3.8 .shstrtab, .symtab, .strtab, .dynsym, .dynstr 섹션
2.4 프로그램 헤더
2.4.1 p_type 필드
2.4.2 p_flags 필드
2.4.3 p_offset, p_vaddr, p_paddr, p_filesz, p_memsz 필드
2.4.4 p_align 필드
2.5 요약
연습 문제
3장. PE 바이너리 포맷요약 정리
3.1 MS-DOS 헤더와 MS-DOS 스텁
3.2 PE 시그니처, 파일 헤더, 옵션 헤더
3.2.1 PE 시그니처
3.2.2 PE 파일 헤더
3.2.3 PE 옵션 헤더
3.3 섹션 헤더 테이블
3.4 섹션
3.4.1 .edata와 .idata 섹션
3.4.2 PE코드 섹션의 패딩
3.5 요약
연습문제
4장. LIBBFD를 이용한 바이너리 로더 제작
4.1 libbfd란 무엇인가?
4.2 바이너리 로더의 기본 인터페이스
4.2.1 바이너리 클래스
4.2.2 섹션 클래스
4.2.3 심벌 클래스
4.3 바이너리 로더 구현하기
4.3.1 libbfd 초기화하고 바이너리 열기
4.3.2 바이너리 기본 정보 분석하기
4.3.3 심벌 정보 불러오기
4.3.4 섹션 정보 불러오기
4.4 바이너리 로더 테스트하기
4.5 요약
연습문제
2부. BINARY ANALYSIS FUNDAMENTALS
5장 리눅스 바이너리 분석 기초
5.1 file 명령어를 사용해 식별하기
5.2 ldd 명령어를 사용해 의존성 점검하기
ASCII 코드 신속하게 찾기
5.3 xxd 명령어를 사용해 파일 내부 내용 확인하기
5.4 readelf 명령어를 사용해 ELF 파일 형식 추출하기
5.5 nm 명령어를 사용해 심벌 정보 분석하기
5.6 strings 명령어를 사용해 단서 찾기
5.7 strace와 ltrace 명령어를 사용해 시스템콜 및 라이브러리 호출 추적하기
5.8 ojdump 명령어를 사용해 기계어 수준 동작 확인하기
5.9 gdb 명령어를 사용해 동적으로 문자열 버퍼 덤프하기
5.10 요약
연습문제
6장. 디스어셈블과 바이너리 분석 방법론
6.1 정적 디스어셈블
6.1.1 선형 디스어셈블
6.1.2 재귀적 디스어셈블
6.2 동적 디스어셈블
6.2.1 예제: gdb로 바이너리 실행 추적하기
6.2.2 코드 커버리지 전략
6.3 디스어셈블된 코드와 데이터를 구조화하기
6.3.1 코드 구조화
.eh_frame 섹션을 이용한 함수 탐지
6.3.2 데이터 구조화
6.3.3 디컴파일
6.3.4 중간 언어 표현식
6.4 주요 분석 방법론
6.4.1 바이너리 분석 요소
6.4.2 제어 흐름 분석
6.4.3 데이터 흐름 분석
6.5 디스어셈블시 컴파일러 설정 효과
6.6 요약
연습문제
7장. ELF 바이너리 코드 인젝션 기법
7.1 헥스 에디터를 이용한 원초적 수정 방법
정확한 opcode 찾기
7.1.1 한 바이트 버그 탐구하기
7.1.2 한 바이트 버그 수정하기
7.2 LD_PRELOAD를 사용해 공유 라이브러리 동작 변경하기
7.2.1 힙 오버플로 취약점
7.2.2 힙 오버플로 탐지하기
7.3 코드 섹션 끼워넣기
7.3.1 ELF 섹션 끼워넣기: 전체적 맥락
7.3.2 elfinject 를 사용해 ELF 섹션 삽입하기
7.4 삽입된 코드 호출하기
7.4.1 엔트리 포인트 개조
7.4.2 생성자와 소멸자 탈취하기
7.4.3 GOT 엔트리 탈취하기
7.4.4 PLT 엔트리 탈취하기
7.4.5 직접 및 간접 호출 조작하기
7.5 요약
연습문제
3부. ADVANCED BINARY ANALYSIS
8장. 자체 제작 디스어셈블 도구 구현
8.1 굳이 디스어셈블 과정을 자체 제작할 필요성은?4
8.1.1 자체 제작 디스어셈블 도구 사례: 난독화된 코드
난독화되지 않은 바이너리에서도 코드 겹침 기법이 적용될 수 있다
8.1.2 자체 제작 디스어셈블 도구를 개발할 또 다른 필요성
8.2 캡스톤 살펴보기
8.2.1 캡스톤 설치하기
8.2.2 캡스톤으로 선형 디스어셈블 도구 제작하기
8.2.3 캡스톤 C API 살펴보기
8.2.4 캡스톤으로 재귀적 디스어셈블 도구 제작하기
8.3 ROP 가젯 스캐너 구현
8.3.1 ROP 개요
8.3.2 ROP 가젯 탐색하기
8.4 요약
연습문제
9장. 바이너리 계측
9.1 바이너리 계측이란 무엇인가?
9.1.1 바이너리 계측 API
9.1.2 정적 및 동적 바이너리 계측 비교
9.2 정적 바이너리 계측
9.2.1 int 3 방법
9.2.2 트램펄린 방법
위치 독립 코드에 대한 트램펄린 적용
9.3 동적 바이너리 계측
9.3.1 DBI 시스템 구조
9.3.2 Pin 개요
9.4 Pin을 사용한 프로파일링
9.4.1 프로파일링 도구의 자료구조 및 초기 설정을 위한 코드
9.4.2 함수 심벌 분석하기
9.4.3 기본 블록 계측하기
9.4.4 제어 흐름 명령어 계측하기
9.4.5 명령어 개수, 제어 흐름 변경 및 시스템 콜 횟수 측정하기
9.4.6 프로파일링 프로그램 테스트하기
9.5 Pin을 사용한 자동화 바이너리 패킹 해제
9.5.1 바이너리 패킹 개요
9.5.2 언패킹 도구의 자료구조 및 설정 코드
9.5.3 메모리 사용 기록 계측하기
9.5.4 제어 흐름 명령어 계측하기
9.5.5 메모리 사용 기록 추적하기
9.5.6 OEP 탐지 및 언패킹된 바이너리 덤프하기
9.5.7 언패킹 프로그램 테스트하기
9.6 요약
연습문제
10장. 동적 오염 분석 원리
10.1 DTA란 무엇인가?
10.2 DTA의 세가지 단계: DTA의 세 가지 요소: 오염원, 오염 지역, 오염 전파
10.2.1 오염원 정의하기
10.2.2 오염 지역 설정하기
10.2.3 오염 전파 추적하기
10.3 DTA를 사용해 Heartbleed 버그 탐지하기
10.3.1 Heartbleed 취약점에 대한 간략한 요약
10.3.2 오염 분석 방법을 통해 Heartbleed 탐지하기
10.4 DTA 설계 요소: 오염 단위, 오염 색깔, 오염 정책
10.4.1 오염 단위
10.4.2 오염 색깔
10.4.3 오염 전파 정책
10.4.4 과잉 오염 및 과소 오염
10.4.5 제어 의존성
10.4.6 섀도 메모리
10.5 요약
연습문제
11장. LIBDFT를 이용한 동적 오염 분석 도구 개발
11.1 libdft 소개
11.1.1 libdft 내부 구조
11.1.2 오염 정책
11.2 DTA를 사용해 원격 제어 탈취 탐지하기
11.2.1 오염 정보 확인하기
11.2.2 오염원: 수신된 바이트의 오염
11.2.3 오염 지역: execve 함수의 매개 변수 점검하기
11.2.4 제어권 탈취 시도 탐지하기
11.3 암시적 제어 흐름을 통해 DTA 우회하기
11.4 DTA를 사용해 데이터 유출 탐지하기
11.4.1 오염원: 파일 열기 작업에 대한 오염 추적
11.4.2 오염 지역: 데이터 유출을 시도하는 네트워크 송신 감시
11.4.3 데이터 유출 시도 탐지하기
11.5 요약
연습문제
12장. 기호 실행 원리
12.1 기호 실행 개요
12.1.1 기호적 vs 구체적 실행
12.1.2 기호 실행의 다양한 방법론 분류 및 각 한계점
12.1.3 기호 실행의 확장 용이성 향상하기
12.2 Z3을 이용한 제약조건 풀이
12.2.1 명령어의 도달 가능성 증명
12.2.2 명령어의 도달 불가능성 증명
12.2.3 수식의 유효성 증명
12.2.4 표현식 간소화
12.2.5 비트 벡터를 사용해 기계어 코드의 제약 조건 모델링하기
12.2.6 비트 벡터로 표현된 모호한 표현식 풀이하기
12.3 요약
연습문제
13장. Triton을 이용한 기호 실행 실습
13.1 Triton 개요
13.2 추상 구문 트리를 이용해 상태 정보 관리하기
13.3 Triton을 이용한 백워드 슬라이싱
13.3.1 Triton 헤더 파일 및 Triton 환경 설정
13.3.2 심벌 환경 설정 파일
13.3.3 명령어 에뮬레이팅
13.3.4 Triton의 아키텍처 설정
13.3.5 백워드 슬라이스 계산
13.4 Triton을 이용한 코드 충족도 확대
13.4.1 기호 변수 생성
13.4.2 새로운 경로를 위한 모델 찾기
13.4.3 코드 충족도 도구 실행
13.5 자동으로 취약점 익스플로잇하기
13.5.1 취약한 프로그램
13.5.2 취약한 호출 지점의 주소 찾기
13.5.3 익스플로잇 생성 도구 구현
13.5.4 루트 셸 획득
13.6 요약
연습문제
4부. 부록
부록 A. 인텔 64비트 어셈블리 요점 정리
부록 B. LIBELF를 이용한 PT_NOTE 덮어쓰기 구현
부록 C. 바이너리 분석 도구 추천
부록 D. 참고 문헌