리버스 엔지니어링 핵심 기술 (세트) [보안 분석가라면 꼭 알아야 할]
- 지은이크리스 카스퍼스키, 엘다드 에일람
- 옮긴이서준석, 윤근용
- ISBN : 9788960775107
- 69,000원
- 2013년 12월 31일 펴냄 (절판)
- 페이퍼백 | 1,384쪽 | 188*250mm
- 시리즈 : 해킹과 보안
판매처
- 현재 이 도서는 구매할 수 없습니다.
책 소개
세트 구성: 전2권
『해킹의 꽃 디스어셈블링 Hacker Disassembling Uncovered』 소개
이 책은 고급 해커의 필수 능력인 디스어셈블링 기법을 집중적으로 다룬다. 분석에 필요한 기본 도구와 어셈블리어 분석을 시작으로 각종 보안 메커니즘을 우회할 수 있는 방법을 설명한다. 디버깅, 디스어셈블링에 대한 기본 지식부터 커널 분석, 고급 패치 기술 등 분석 과정에서 마주칠 수 있는 깊이 있는 주제들을 다양한 관점과 예제를 통해 학습할 수 있는 훌륭한 분석 길잡이가 되어 줄 것이다. .
이 책에서 다루는 내용
디스어셈블이 필요한 상황, 특정 언어 구조체를 분석하기 위한 시작점, 보호 메커니즘 개발자가 숨겨 놓은 트랩에 빠지지 않고 수백 메가에 육박하는 코드 밀림에서 길을 잃지 않는 방법을 알려주는 책이다. 특히 이 개정2판에서는 실제 디스어셈블링 기법에 관련된 내용이 추가됐다. 특히 메모리 덤프 분석, 합법적인 소프트웨어 보호 메커니즘, 악성 프로그램 관련 내용이 새로운 단원으로 추가됐다. 또한 관련 예제와 원리들은 최신 동향에 맞춰 수정했다. 안티디버깅 기법 우회, 패킹, 암호화, 다형성, 간단한 난독화 코드 극복과 관련된 내용에 주안점을 두고 작성했다.
『리버싱』 소개
소프트웨어를 해부해서 설계와 구현 내용, 심지어 소스코드까지도 알아낼 수 있어서 최근 보안업계의 화두로 떠오른 리버싱. 복제방지기술 무력화와 상용보안대책 무력화로 무장한 해커들의 리버싱 공격 패턴을 파악하기 위한 최신 기술을 담은 해킹 보안 업계 종사자의 필독서. 소프트웨어의 약점을 찾아내 보완하고, 해커의 공격이나 악성코드를 무력화하며, 더 좋은 프로그램을 개발할 수 있도록 프로그램의 동작 원리를 이해하는 데도 효율적인 리버스 엔지니어링의 비밀을 파헤친다.
이 책에서 다루는 내용
■ IA-32 호환 프로세서용 컴파일러가 만든 어셈블리 언어 코드를 읽는 방법
■ 문서화되지 않은 파일 포맷이나 네트워크 프로토콜 해석
■ 리버스 엔지니어링이 합법인 경우와 불법인 경우, 그리고 불법일 때의 이유
■ 리버싱을 활용해 해커가 복사 방지 기술을 무력화하는 방법
■ 리버스 엔지니어링을 적용해 악성코드를 무력화하는 방법
■ 코드 리버싱을 막는 방어책과 효과적인 수행 방법
■ 닷넷 플랫폼 리버싱과 어셈블리 언어인 MSIL
■ 실제 악성코드 프로그램 분석 방법
■ 악성코드 프로그램을 이용해 공격자가 감염된 시스템 제어권을 획득하는 과정
이 책의 대상 독자
이 책은 여러 분야에 종사하는 사람들에게 도움이 되는 기술을 다양하게 다룬다. 운영체제, 어셈블리 언어, 컴파일 같은 소프트웨어의 다양한 로우레벨 측면을 알고 싶어 하는 소프트웨어 개발자는 특히 더 유용한 정보를 많이 찾을 수 있을 것이다. 운영체제나 소프트웨어 라이브러리, 특정 소프트웨어 컴포넌트 등 기존 코드를 빠르고 효과적으로 분석할 수 있는 기술을 향상시키려는 사람에게도 유용할 것이다. 이외에도 이 책은 보안이나 저작권 제어 등과 같은 다양한 주제도 들어 있으므로, 리버스 엔지니어링에 특별한 관심이 없더라도 이 책이 다루는 다양한 주제에서 흥미로운 내용을 찾을 수 있을 것이다.
이 책을 읽기 전 선수 지식을 제공하기 위해 나는 비교적 최신의 기술 사항들을 가능한 한 모두 다루려고 노력했다. 따라서 1부는 이 책을 읽는 데 꼭 필요한 기본 지식을 설명하면서 시작한다. 하지만 이 책에서 정말로 많은 것을 얻기 원하는 독자라면 어느 정도의 소프트웨어 개발 경험이나 지식은 갖추는 편이 좋다. 전문적인 소프트웨어 개발 경험은 전혀 없지만 현재 컴퓨터 공학을 전공하는 학생이라면 이 책을 읽는 데 큰 문제는 없을 것이다. 반대로 컴퓨터를 전공한 적은 없지만 수년간 프로그래밍 작업을 수행해 온 사람이라면 이 책에서 더 많은 내용을 배울 수 있을 것이다.
마지막으로 이 책은 로우레벨 소프트웨어와 리버스 엔지니어링 경험이 이미 있는 사람 중에서 흥미로운 고급 기술을 배우길 원하거나 기존 코드에서 상세한 정보를 추출하는 방법을 알고자 하는 사람들에게 도움이 많이 될 것이다.
목차
목차
- 『해킹의 꽃 디스어셈블링 Hacker Disassembling Uncovered』
- 1부 해킹 툴의 소개
- 1장 해킹 툴 입문
- 디버거
- 디스어셈블러
- 디컴파일러
- 헥스 편집기
- 언패커
- 덤퍼
- 리소스 편집기
- 스파이
- 감시 프로그램
- 수정 프로그램
- 보호 CD 복사기
- 2장 유닉스용 해킹 툴
- 디버거
- 디스어셈블러
- 스파이
- 헥스 편집기
- 덤퍼
- 자동화된 보호 툴
- 3장 디버거 에뮬레이션과 에뮬레이터
- 에뮬레이터 소개
- 역사적 개요
- 대표적인 에뮬레이터
- 에뮬레이터 선택
- 4장 어셈블러 소개
- 어셈블리어의 철학
- C 예제로 어셈블리 개념 설명
- 작업공간으로서 어셈블리 삽입
- 사용 가능한 툴
- 어셈블리 번역기의 개요와 비교
- 2부 기본 해킹 기술
- 5장 기본 해킹 기술 익히기
- 비밀 키 유형에 따른 보호 메커니즘 분류
- 보호 강도
- 상용 솔루션의 단점
- 사용 기술의 구현 에러
- 심각한 결과를 야기하는 사소한 오류의 정리
- 6장 시작 준비
- 보호 기술 제작과 크랙
- 디스어셈블러 익히기
- 실전 크랙 예제
- 정리
- 7장 애플리케이션 디버깅 익히기
- 디버깅 소개
- 디스어셈블러와 디버거를 같이 사용
- API 함수에 브레이크 포인트 설정
- 메시지에 브레이크 포인트 설정
- 데이터에 브레이크 포인트 설정
- 스택 역추적
- DLL 디버깅
- 정리
- 8장 유닉스와 리눅스 환경에서의 디버깅 특성
- GDB 기반의 Ptrace
- GDB에서 바이너리 파일 디버깅
- 9장 Linice로 수행하는 커널 디버깅의 기초
- 시스템 요구 사항
- Linice 컴파일과 설정
- 시스템 부팅과 디버거 실행
- Linice로 작업할 때 지켜야 할 기본 원칙
- 정리
- 10장 고급 디버깅 주제
- 소프트아이스를 로그 수집기로 사용
- 무작위 브레이크 포인트로 해킹 트릭 사용
- 범위 설정을 통한 크래킹
- 정리
- 3부 고급 디스어셈블링 기술
- 11장 32비트 PE 파일 디스어셈블링
- 다양한 실행 환경에서 PE 파일 구조의 특징
- 일반적인 개념과 PE 파일의 요구 사항
- PE 파일 구조
- PE 파일에 코드를 삽입하거나 제거하는 기술
- 정리
- 12장 리눅스와 BSD에서 ELF 파일 디스어셈블링
- 필요한 도구
- ELF 파일 구조
- ELF 파일에 외부 코드 삽입
- 리눅스에서 간단한 크랙미 프로그램을 디스어셈블링
- 정리
- 13장 x86-64 아키텍처에서 수행하는 디스어셈블링
- 소개
- 필요한 도구
- x86-64 아키텍처의 개요
- 64비트 모드로 전환
- x86-64 환경에서 만드는 ‘Hello, World’ 프로그램
- 정리
- 14장 리눅스 커널 디스어셈블링과 해킹
- 디스어셈블링 리눅스 커널
- 커널 해킹의 비밀
- 15장 고급 패칭 기법
- 온라인 패칭의 비밀과 트릭
- 클라이언트 프로그램을 크래킹하는 잘 알려지지 않은 방법
- 윈도우 NT/2000/XP 커널 핵
- BSOD 이후의 세계가 존재하는가?
- 참고 사이트
- 정리
- 16장 기타 형식의 파일 디스어셈블링
- PDF 파일 디스어셈블링
- 정리
- 4부 실제 코드 연구
- 17장 윈도우에서의 숨바꼭질
- 윈도우 환경을 위한 안티디버깅 기법
- 윈도우 환경에서 사용되는 스텔스 기법
- 정리
- 18장 패커 극복법
- 예비 분석
- 언패킹과 대체 방안
- 언패킹 알고리즘
- 오리지널 진입점 검색
- 보호된 애플리케이션을 덤프
- 정리
- 19장 난독화 극복법
- 난독화 도구의 작동 원리
- 난독화된 프로그램을 크랙하는 방법
- 블랙박스 접근법
- 가상머신 지하 감옥
- 정리
- 20장 리눅스와 BSD에서의 패커 극복법
- 패커가 성능에 미치는 영향
- UPX
- Burneye
- Shiva
- 패커 비교
- 정리
- 21장 악성코드 디버깅과 디스어셈블링
- 디버거를 활용한 방첩 활동
- 공격 코드 감사와 디스어셈블링
- 참고 자료
- 정리
- 찾아보기
- 『리버싱』
- 1부 리버싱 101
- 1장 기초
- 리버스 엔지니어링
- 소프트웨어 리버스 엔지니어링: 리버싱
- 리버싱 적용
- 보안 관련 리버싱
- 악성코드 소프트웨어
- 암호 알고리즘 리버싱
- 디지털 저작권 관리
- 프로그램 바이너리 감사
- 소프트웨어 개발에서의 리버싱
- 소프트웨어 간의 상호 운용
- 경쟁 제품 분석
- 소프트웨어의 품질과 안정성 측정
- 보안 관련 리버싱
- 로우레벨 소프트웨어
- 어셈블리 언어
- 컴파일러
- 가상 머신과 바이트 코드
- 운영체제
- 리버싱 절차
- 시스템 레벨 리버싱
- 코드 레벨 리버싱
- 사용 툴
- 시스템 모니터링 툴
- 디스어셈블러
- 디버거
- 디컴파일러
- 리버싱은 합법적인 작업인가
- 상호 운용성
- 경쟁
- 저작권법
- 영업 비밀과 특허권
- 디지털 밀레니엄 저작권법
- DMCA 사례
- 사용권 계약
- 예제 코드와 툴
- 정리
- 2장 로우레벨 소프트웨어
- 하이레벨 관점
- 프로그램 구조
- 모듈
- 공통 구성 요소
- 데이터 처리
- 변수
- 사용자 정의 데이터 구조체
- 리스트
- 제어 흐름
- 하이레벨 언어
- C
- C++
- 자바
- C#
- 프로그램 구조
- 로우레벨 관점
- 로우레벨 데이터 처리
- 레지스터
- 스택
- 힙
- 실행 데이터 섹션
- 제어 흐름
- 로우레벨 데이터 처리
- 어셈블리 언어 입문
- 레지스터
- 플래그
- 명령 포맷
- 기본 명령
- 데이터 이동
- 산술 연산
- 비교 연산
- 조건 분기
- 함수 호출
- 코드 예
- 컴파일러 기초
- 컴파일러란
- 컴파일러 아키텍처
- 프런트엔드
- 중간 표현
- 최적화기
- 백엔드
- 리스팅 파일
- 사용 컴파일러
- 실행 환경
- 소프트웨어 실행 환경(가상 머신)
- 바이트 코드
- 인터프리터
- Just-in-Time 컴파일러
- 리버싱 전략
- 최신 프로세서에서의 하드웨어 실행 환경
- Intel NetBurst
- μops(Micro-Ops)
- 파이프라인
- 분기 예측
- 소프트웨어 실행 환경(가상 머신)
- 정리
- 하이레벨 관점
- 3장 윈도우 기초
- 컴포넌트와 기본 아키텍처
- 간략한 역사
- 특징
- 지원 하드웨어
- 메모리 관리
- 가상 메모리와 페이징
- 페이징
- 페이지 폴트
- 워킹 셋
- 커널 메모리와 유저 메모리
- 커널 모드 공간
- 섹션 객체
- VAD 트리
- 유저 모드 메모리 할당
- 메모리 관리 API
- 가상 메모리와 페이징
- 객체와 핸들
- 네임드 객체
- 프로세스와 스레드
- 프로세스
- 스레드
- 컨텍스트 스위칭
- 동기화 객체
- 프로세스 초기화 과정
- 애플리케이션 프로그래밍 인터페이스
- Win32 API
- 네이티브 API
- 시스템 콜 메커니즘
- 실행 포맷
- 기본 개념
- 이미지 섹션
- 섹션 정렬
- 동적 링크 라이브러리
- 헤더
- 임포트와 익스포트
- 디렉터리
- 입력과 출력
- I/O 시스템
- Win32 서브시스템
- 객체 관리자
- 구조화된 예외 처리
- 정리
- 컴포넌트와 기본 아키텍처
- 4장 리버싱 툴
- 다양한 리버싱 방법
- 오프라인 코드 분석(Dead-Listing)
- 라이브 코드 분석
- 디스어셈블러
- IDA Pro
- ILDasm
- 다양한 리버싱 방법
- 디버거
- 유저 모드 디버거
- OllyDbg
- WinDbg를 이용한 유저 모드 디버깅
- IDA Pro
- PEBrowse Professional Interactive
- 커널 모드 디버거
- WinDbg를 이용한 커널 모드 디버깅
- Numega SoftICE
- 가상 머신에서의 커널 디버깅
- 유저 모드 디버거
- 디컴파일러
- 시스템 모니터링 툴
- 패치 툴
- Hex Workshop
- 기타 리버싱 툴
- 실행 이미지 덤프 툴
- DUMPBIN
- PEView
- PEBrowse Professional
- 실행 이미지 덤프 툴
- 정리
- 리버싱과 상호운용성
- 기본 원칙
- 문서화되지 않은 API를 찾는 방법
- 찾고자 하는 것
- 사례 연구: NTDLL.DLL의 Generic Table API
- RtlInitializeGenericTable
- RtlNumberGenericTableElements
- RtlIsGenericTableEmpty
- RtlGetElementGenericTable
- 셋업과 초기화
- 로직과 구조
- 검색 루프 1
- 검색 루프 2
- 검색 루프 3
- 검색 루프 4
- 소스코드 추출
- RtlInsertElementGenericTable
- RtlLocateNodeGenericTable
- RtlRealInsertElementWorker
- Splay 트리
- RtlLookupElementGenericTable
- RtlDeleteElementGenericTable
- 분석한 내용 종합
- 정리
- Cryptex
- Cryptex 사용
- Cryptex 리버싱
- 패스워드 검증 과정
- “Bad Password” 메시지 잡아내기
- 패스워드 변환 알고리즘
- 패스워드 해싱
- 디렉터리 구조
- 디렉터리 처리 코드 분석
- 파일 엔트리 분석
- 디렉터리 구조 덤프
- 파일 추출 과정
- 파일 목록 검색
- 파일 복호화
- 부동소수점 연산
- 복호화 루프
- 해시 값 검증
- 정리
- 좀 더 자세히
- 결론
- 문제점 정의
- 보안 취약점
- 스택 오버플로우
- 간단한 스택 보안 취약점
- 내부 구현
- 스택 검사
- 비실행 가능 메모리
- 힙 오버플로우
- 문자열 필터
- 정수 오버플로우
- 사용자 입력 정수에 대한 산술 연산
- 형 변환 에러
- 스택 오버플로우
- 사례: IIS 인덱싱 서비스 보안 취약점
- CVariableSet::AddExtensionControlBlock
- DecodeURLEscapes
- 정리
- 악성코드의 종류
- 바이러스
- 웜
- 트로이 목마
- 백도어
- 모바일 코드
- 애드웨어/스파이웨어
- 스틱키 소프트웨어
- 미래의 악성코드
- 정보 탈취 웜
- 바이오스/펌웨어 악성코드 331
- 악성코드의 목적
- 악성코드 취약점
- 다형성
- 변종
- 안전한 리버싱 환경 구축
- Backdoor.Hacarmy.D
- 실행 파일 언패킹
- 최초 실행
- 설치
- 네트워크 연결
- 서버에 연결
- 채널에 접속
- 백도어와 통신
- SOCKS4 서버 실행
- 자체 제거
- Backdoor.Hacarmy.D: 명령 레퍼런스
- 정리
- 저작권
- 사회적 측면
- 소프트웨어 저작권 침해
- 문제 정의
- 보안 결함
- 필요 조건
- 이론적으로 크랙이 불가능한 모델
- 보호 유형
- 매체 기반 보호
- 시리얼 번호
- 질의 응답과 온라인 인증
- 하드웨어 기반의 보호
- 서비스로서의 소프트웨어
- 진보된 보호 개념
- 크립토 프로세서
- 디지털 저작권 관리
- DRM 모델
- 윈도우 미디어 저작권 관리자
- 시큐어 오디오 패스
- DRM 모델
- 워터 마크
- 신뢰 컴퓨팅
- 복사 방지 기술 공격
- 정리
- 안티 리버싱이 필요한 이유
- 기본적인 안티 리버싱 방법
- 심볼 정보 제거
- 코드 암호화
- 안티 디버거 기술
- 디버거 기본
- IsDebuggerPresent API
- SystemKernelDebuggerInformation
- 싱글 스텝 인터럽트를 이용한 SoftICE 탐지
- 트랩 플래그
- 코드 체크섬
- 안티 디스어셈블러
- 선형 스윕 디스어셈블러
- Recursive Traversal 디스어셈블러
- 적용
- 코드 난독화
- 제어 흐름 변환
- Opaque Predicates
- 안티 디컴파일러
- Table Interpretation
- 인라인닝과 아웃라이닝
- 인터리빙 코드
- 순서 변환
- 데이터 변환
- 변수 인코딩
- 배열 재구성
- 정리
- 패치
- Keygen
- 키 생성 알고리즘 추출
- 고급 크래킹: Defender
- Defender의 초기화 루틴 리버싱
- 복호화된 코드 분석
- 사라진 SoftICE
- 스레드 리버싱
- “Killer” 스레드 무력화
- KERNEL32.DLL 로딩
- 함수 재암호화
- 엔트리 포인트로 다시 돌아가서
- 프로그램 파라미터 파싱
- 사용자 이름 처리
- 사용자 정보 검증
- 코드 복호화
- Defender에 대한 무작위 대입
- Defender의 보호 기술
- 함수 레벨의 암호화
- 상대적으로 강력한 암호 블록 체인
- 재 암호화
- 애플리케이션/운영체제와의 인터페이스 난독화
- 프로세서 타임 스탬프 검증 스레드
- 실행 시에 복호화 키 생성
- 상호 의존 키
- 사용자 입력 기반의 복호화 키
- 인라이닝
- 함수 레벨의 암호화
- 정리
- 기반 지식
- 닷넷 기본
- 매니지드 코드
- 닷넷 프로그래밍 언어
- 공통 타입 시스템
- 중간 언어
- 평가 스택
- 활성화 레코드
- IL 명령
- IL 코드 샘플
- Counting Items
- 링크드 리스트 샘플
- 디컴파일러
- 난독기
- 심볼 이름 변경
- 제어 흐름 변경
- 디컴파일과 디스어셈블리 차단
- 난독화된 코드 리버싱
- XenoCode
- Preemptive Solutions의 DotFuscator
- Remotesoft 난독기와 링커
- Remotesoft Protector
- 어셈블리 프리컴파일
- 어셈블리 암호화
- 정리
- 네이티브 코드 디컴파일
- 전형적인 디컴파일러의 구조
- 중간 표현
- 표현식과 표현식 트리
- 제어 흐름 그래프
- 프론트엔드
- 의미 분석
- 제어 흐름 그래프 생성
- 코드 분석
- 데이터 흐름 분석
- 단일 정적 할당
- 데이터 전달
- 레지스터 변수 구별
- 데이터 타입 전달
- 타입 분석
- 기본 데이터 타입
- 복잡한 데이터 타입
- 제어 흐름 분석
- 라이브러리 함수의 구별
- 데이터 흐름 분석
- 백엔드
- 실제 IA-32 디컴파일러
- 정리