책 소개
이 책은 고급 해커의 필수 능력인 디스어셈블링 기법을 집중적으로 다룬다. 분석에 필요한 기본 도구와 어셈블리어 분석을 시작으로 각종 보안 메커니즘을 우회할 수 있는 방법을 설명한다. 디버깅, 디스어셈블링에 대한 기본 지식부터 커널 분석, 고급 패치 기술 등 분석 과정에서 마주칠 수 있는 깊이 있는 주제들을 다양한 관점과 예제를 통해 학습할 수 있는 훌륭한 분석 길잡이가 되어 줄 것이다.
이 책에서 다루는 내용
디스어셈블이 필요한 상황, 특정 언어 구조체를 분석하기 위한 시작점, 보호 메커니즘 개발자가 숨겨 놓은 트랩에 빠지지 않고 수백 메가에 육박하는 코드 밀림에서 길을 잃지 않는 방법을 알려주는 책이다. 특히 이 개정2판에서는 실제 디스어셈블링 기법에 관련된 내용이 추가됐다. 특히 메모리 덤프 분석, 합법적인 소프트웨어 보호 메커니즘, 악성 프로그램 관련 내용이 새로운 단원으로 추가됐다. 또한 관련 예제와 원리들은 최신 동향에 맞춰 수정했다. 안티디버깅 기법 우회, 패킹, 암호화, 다형성, 간단한 난독화 코드 극복과 관련된 내용에 주안점을 두고 작성했다.
이 책의 구성
1부 ‘해킹 툴의 소개’, 2부 ‘기본 해킹 기술’, 3부 ‘고급 디스어셈블링 기법’, 4부 ‘실제 코드 연구’의 네 부분으로 구성되어 있다.
이 책은 다음과 같은 단원들로 구성된다.
■ 1장 ‘해킹 툴 입문’에서는 디버거, 디스어셈블러, 디컴파일러, 헥스 에디터, 언패커, 덤퍼 등의 대표적인 윈도우 해킹 툴을 개략적으로 다룬다. 또한 해킹 세계로 뛰어드는 데 필요한 최소한의 지식을 습득하기 위한 필독 도서들을 소개한다.
■ 2장 ‘유닉스용 해킹 툴’에서는 유닉스와 리눅스 환경에서 사용할 수 있는 해킹 툴을 소개한다.
■ 3장 ‘디버거 에뮬레이션과 에뮬레이터’에서는 유명하고 흥미로운 주제인 디버거 에뮬레이팅과 에뮬레이터 관련 내용을 다룬다. 코드 분석가들은 에뮬레이팅 기법을 활용해 거의 무한대의 가능성을 확보할 수 있다. 유명한 에뮬레이터와 애플리케이션 영역에 대한 설명뿐만 아니라, 현존하는 에뮬레이터의 비교 분석, 관련 분야의 최신 기술을 소개한다.
■ 4장 ‘어셈블러 소개’에서는 어셈블러의 개괄적인 내용과 함께 각 언어의 장단점을 다룬다. 어셈블리 언어를 능숙하게 다루지 못하면 진정한 해커라고 볼 수 없기 때문에 4장의 내용은 매우 중요하다고 볼 수 있다. 고급 프로그래밍 언어 지식만으로는 그 어떤 것도 디스어셈블할 수 없다. 초보자와 전문 프로그래머 모두의 신중한 접근이 요구되는 어셈블리 변환기를 선택하는 문제도 다룬다.
■ 2부의 첫 번째 단원인 5장 ‘기본 해킹 기술 익히기’에서는 보호 메커니즘에 대한 간략한 소개와 함께 여러 메커니즘의 강점과 약점, 현존하는 보호 메커니즘들이 공통적으로 갖는 구현상 결함을 다룬다. 또한 합법적인 사용자들의 편의성을 해치지 않으면서 보호 메커니즘을 강화하는 데 도움이 될 만한 보호 메커니즘 개발 권고 내용도 제공한다.
■ 6장 ‘시작 준비’에서는 해커가 보호 메커니즘을 크랙할 때 사용하는 기본 기법들을 소개한다. 헥스 데이터, API 스파이, 디스어셈블러를 다루는 기본 기법뿐만 아니라 간단한 해킹 예제도 제공한다.
■ 7장 ‘애플리케이션 디버깅 익히기’에서는 애플리케이션 디버깅을 소개한다. 이 책이 디스어셈블링에 초점이 맞춰져 있긴 하지만, 때로는 전체 프로그램의 디스어셈블 리스트를 분석하는 것이 비효율적인 경우가 있다. 디버거는 가장 인기 있는 해킹 도구이며, 종종 디스어셈블러와 함께 사용된다. 7장에서는 디버거를 사용해 효율적으로 보호 메커니즘 코드를 찾아내는 기법의 설명과 예제를 제공한다.
■ 8장 ‘유닉스와 리눅스 환경에서의 디버깅 특성’에서는 내용상 7장과 이어지는 부분이라고 할 수 있다. 여기서는 유닉스와 리눅스 환경에서 부딪힐 수 있는 특정 디버깅 기능을 다룬다. 유닉스 세계에서 가장 강력한 디버거로 꼽히는 GDB를 효율적으로 사용하는 방법도 설명한다. 특히 심볼 정보 없이 바이너리 파일을 디버깅하는 방법에 초점이 맞춰져 있다.
■ 9장 ‘Linice로 수행하는 커널 디버깅의 기초’에서는 보호된 애플리케이션 해킹에 최적화된 디버거인 Linice 예제를 통해 커널 디버깅 관련 주제를 다룬다.
■ 10장 ‘고급 디버깅 주제’에서는 2부의 마지막 단원으로, 고급 디버깅 주제와 상급 난이도의 코드 분석에 필요한 내용을 다룬다. 구체적으로 10장에서는 소프트아이스(SoftICE)를 로거로 사용하거나, 디버거와 디스어셈블러 조합을 사용해 효율적으로 브레이크 포인트를 다루는 기법과 큰 크기의 프로그램에서 보호 메커니즘 코드를 재빨리 찾아내는 기법 등 좀 더 효율적인 해킹을 수행하기 위한 다양한 트릭을 학습할 수 있는 계기를 제공한다.
■ 11장 ‘32비트 PE 파일 디스어셈블링’에서는 32비트 PE 파일을 디스어셈블링하는 방법을 중점적으로 다룬다. PE 파일 구조와 해당 형식의 파일에 외부 코드를 삽입하는 다양한 기법도 다룬다. 대부분의 웜, 바이러스, 셸코드와 보호 메커니즘이 코드 삽입 기법을 사용하기 때문에 이 책의 뒷부분을 이해하려면 11장의 내용을 반드시 숙지해야 한다.
■ 12장 ‘리눅스와 BSD에서 ELF 파일 디스어셈블링’에서는 ELF 파일에 외부 코드를 삽입하는 기법과 실제 디스어셈블링 예제를 포함해 ELF 파일을 디스어셈블링할 때 필요한 여러 이슈를 소개한다.
■ 13장 ‘x86-64 아키텍처에서 수행하는 디스어셈블링’에서는 AMD 64 아키텍처상에서 64비트 실행 파일을 디스어셈블링하는 방법과 관련된 내용을 다룬다.
■ 14장 ‘리눅스 커널 디스어셈블링과 해킹’에서는 운영체제 커널 디스어셈블링 기법을 설명하며, 리눅스 커널에 초점을 맞췄다. 커널을 분석하는 기법과 함께 간단한 커널 해킹 예제를 제공한다.
■ 15장 ‘고급 패칭 기법’에서는 온라인 패칭과 스텔스 기법의 비밀을 포함한 고급 패칭 기법을 다룬다. 윈도우 NT/2000/XP 커널 수정 예제를 통해 패칭 기법을 설명한다. 또한 온라인 패칭에 대항하는 커널 보호 메커니즘을 제거하기 위한 문서화되거나 문서화되지 않은 기능과 함수를 사용하는 방법도 설명한다. BSOD를 극복하기 위한 소프트아이스 사용 방법을 포함해 정교하지 못한 커널 패칭으로 인한 부작용을 극복하는 방법도 설명한다.
■ 16장 ‘기타 형식의 파일 디스어셈블링’은 3부의 마지막 단원으로, 다양한 형식의 파일을 디스어셈블링하는 방법을 다룬다. 32비트와 64비트 PE 파일, ELF 파일 디스어셈블링 관련 내용을 다뤘던 이전 단원들과 달리 16장에서는 PDF 파일 예제를 통해 다른 형식의 파일을 디스어셈블하는 기법을 설명한다.
■ 17장 ‘윈도우에서의 숨바꼭질’은 윈도우 환경에서 안티디버깅 기법과 스텔스 기법을 활용하는 방법을 다룬다. 동일 주제를 유닉스와 리눅스 환경에서 구현하는 방법에 대한 내용은 이 책의 소스코드에서 찾아볼 수 있다.
■ 18장 ‘패커 극복법’에서는 윈도우 환경에서 패킹됐거나 보호된 프로그램을 조사하는 방법을 다룬다. 패킹이 적용된 형태로 배포되는 프로그램의 수는 증가 추세에 있다. 패커의 주목표는 코드 분석을 어렵게 만드는 것이다. 이러한 일환으로 패커는 프로텍터 형태로 빠르게 진화한다. 해커와 합법적인 사용자에게 같은 무기가 사용된다. 웜, 바이러스, 트로이 목마는 안티바이러스 프로그램으로부터 자신의 존재를 숨기기 위해 패커와 프로텍터를 사용한다.
■ 19장 ‘난독화 극복법’에서는 코드 난독화를 극복하는 방법을 다룬다. 코드 난독화는 소프트웨어 코드 분석을 복잡하게 만드는 일련의 기법과 방법을 총칭한다. 아직까지 해커가 만든 이 무기에 대응할 수 있는 효과적인 기법은 소개되지 않았다. 하지만 이런 기법을 구현하려는 시도는 여러 방면에서 이뤄지고 있다.
■ 20장 ‘리눅스와 BSD에서의 패커 극복법’에서는 유닉스와 리눅스 환경에서 동작하는 패커, 프로텍터, 난독화 수행기를 극복하는 방법을 다룬다. 아직까지 이런 유닉스 기반 보호 메커니즘은 해커의 기술 연마를 위해 사용되는 크랙미 예제 형태로만 존재한다. 대부분 유닉스 프로그램이 소스코드 형태로 배포되는 오픈소스 프로젝트인 것이 그 이유로 손꼽힌다. 하지만 상용 유닉스 프로그램은 점차 증가하는 추세에 있다. 그러므로 해커는 이런 강력한 적에 대항할 수 있는 준비를 해야 한다.
■ 21장 ‘악성코드 디버깅과 디스어셈블링’에서는 웜, 바이러스, 악성코드 감시, 검출, 디스어셈블링 관련 주제를 다룬다. 안티바이러스 소프트웨어(모든 업데이트가 적용된 제품이라 할지라도)가 항상 악성코드를 탐지하지 못하기 때문에 이런 주제를 이해하는 것은 매우 중요하다. 숙련된 해커는 분석 대상이 어떤 내용을 담고 있더라도 자신의 경험과 강력한 무기인 디버거(보통 소프트아이스와 같은 도구를 사용)와 기타 도구를 사용해 악성 코드의 정체를 찾아낼 수 있다.
목차
목차
- 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장 악성코드 디버깅과 디스어셈블링
- 디버거를 활용한 방첩 활동
- 공격 코드 감사와 디스어셈블링
- 참고 자료
- 정리