• 문제 풀이로 배우는 시스템 해킹 테크닉
  • 해커스쿨 FTZ를 활용한 단계별 해킹 수련법

  • 여동기 지음

  • 보안 & 해킹 시리즈 _ 003
  • ISBN: 9788998139148
  • 32,000원 | 2013년 02월 22일 발행 | 476쪽



해커스쿨 FTZ를 통해 시스템 해킹 테크닉을 익힌다!

이 책에서는 해커스쿨 FTZ에서 출제되는 문제를 통해 시스템 해킹 원리를 다룬다. 상세한 저자의 설명과 함께 단계별 문제 풀이 과정을 따라 하다 보면 독자는 자연스럽게 시스템 해킹의 원리와 테크닉을 익힐 수 있다. 우선 시스템 해커가 갖춰야 할 기본 소양으로 가장 기본적인 바이너리의 메모리 레이아웃을 소개하는 것부터 시작해 백도어, 시스템 인터럽트, 버퍼 오버플로우로 발생하는 취약점, 그리고 리버싱으로 소스코드를 복원하면서 어셈블리어 수준까지 이해하고 발견한 취약점을 공격하는 익스플로잇 코드를 작성하는 법을 다룬다. 더불어 로컬 경량 셸코드와 리버스 경량 셸코드를 만드는 방법까지 시스템 해킹에 관한 모든 핵심적인 내용이 이 책에 포함돼 있다.

이 책에서 다루는 내용

  • 바이너리의 메모리 레이아웃
  • 백도어의 원리 및 해킹 방법
  • 시스템 인터럽트의 동작 원리
  • 버퍼 오버플로우 취약점의 동작 원리
  • 포맷스트링 취약점을 활용한 해킹
  • 스택 가드 및 포인터 변조
  • 리버싱을 통한 소스코드 복원 방법
  • 로컬 경량 셸코드 제작

 

베타 리뷰

“이 책은 해커가 되고 싶은 사람뿐 아니라 보안에 관심이 있으면서 해킹과 관련된 궁금증과 지식이 필요한 분들을 위해 단계별로 체계적인 설명과 함께 기초적인 지식을 제공한다. 기본적인 지식뿐 아니라 해킹의 원리를 이해하기 쉽게 설명할뿐더러 공부하는 데 지치지 않게 문제 풀이 형식으로 설명함으로써 어렵고 복잡한 해킹의 원리를 독자들에게 고스란히 전해준다.”

-- 넥슨 정보보안실장 홍관희

“이 책은 단순한 해킹에 대한 논리와 설명만이 있는 것이 아니라 문제가 발생했을 때 문제를 해결하는 과정이 단계적으로 설명돼 있어 한층 더 이해하기 쉬웠습니다. 책에 나열돼 있는 경우 이외에도 책에서 알려주는 사고 방식을 통해 책에서 다루는 내용 이상의 문제를 해결할 수 있을 것입니다.”

-- 리눅스엔지니어 김태욱

“해커스쿨에는 ROP나 커널 해킹 등 고급 주제가 부족하다는 아쉬움이 있다. 이 책으로 기본기를 잘 다져서 overthewire, smashthestack, exploit-exercisesr 같은 외국 워게임에도 도전한다면 더욱 좋을 것이다. 아울러 우리나라에서도 다양한 레벨의 워게임이 더 늘어나기를 소망해 본다.

-- alternatives팀 mayfly74

여동기

주로 superdk라는 닉네임으로 활동하지만 rokhacker라는 닉네임을 사용하기도 한다. 2000년부터 침입탐지 시스템 구축을 시작으로 모의해킹과 관제실 구축 실무를 했고, Song Of Freedom 팀으로 Defcon CTF17에서 6위, 남녀노소팀으로 ISEC2009 CTF 준우승 후 ISEC 2010 CTF 본선에서 우승했다.

H&S에서 출간하는 해킹과 보안에 2008년 ~ 2010년까지 네트워크 해킹, 무선AP 공격, 윈도우 리버싱 기초에 대해 칼럼을 썼다. 현재는 기업체에서 보안 담당자로 근무하면서 WiseGuys팀에서도 연구하고 있다.

  • 00장: 메모리 레이아웃 기초
    • 메모리 구조의 이해
    • 메모리 레이아웃을 이해하기 위한 구조 분석
  •  
  • 01장: 백도어란 무엇인가?
    • 문제 파악
    • 문제 분석
    • 의도 분석
    • 공격
    • SetUID, SetGID와 스티키 비트
  •  
  • 02장: 해킹의 시작
    • 문제 파악
    • 문제 분석
    • 의도 분석
    • 공격
  •  
  • 03장: system 함수의 위험성
    • 문제 파악
    • 문제 분석
    • 의도 분석
    • 공격
    • 버퍼 오버플로우 공격 맛보기
    • 버퍼 오버플로우 RTL 고급 공격 맛보기
  •  
  • 04장: xinetd 백도어
    • 문제 파악
    • 문제 분석
    • 의도 분석
    • 공격
  •  
  • 05장: 레이스 컨디션
    • 문제 파악
    • 문제 분석
    • 의도 분석
    • 공격
  •  
  • 06장: 시스템 인터럽트의 위험성
    • 문제 파악
    • 문제 분석
    • 의도 분석
    • 공격
  •  
  • 07장: 암호화의 시작
    • 문제 파악
    • 의도 분석
    • 공격
  •  
  • 08장: 리눅스 패스워드 파일 크랙
    • 문제 파악
    • 의도 분석
    • 공격
  •  
  • 09장: 버퍼 오버플로우 입문
    • 문제 파악
    • 의도 분석
    • 공격
    • 스크립트를 이용한 문자열 입력
  •  
  • 10장: 공유 메모리에 데이터 읽고 쓰기
    • 문제 파악
    • 의도 분석
    • 공격
    • 공유 메모리 추가 설명
  •  
  • 11장: 포맷스트링과 버퍼 오버플로우
    • 문제 파악
    • 의도 분석
    • 공격
    • 포맷스트링 절대값 지정자
    • 버퍼 오버플로우 심화 학습
  •  
  • 12장: 버퍼 오버플로우
    • 문제 파악
    • 의도 분석
    • 공격
  •  
  • 13장: 스택 가드
    • 문제 파악
    • 의도 분석
    • 공격
  •  
  • 14장: 루틴 분기 키값의 이해(I)
    • 문제 파악
    • 의도 분석
    • 공격
  •  
  • 15장: 루틴 분기 키값의 이해(II)
    • 문제 파악
    • 의도 분석
    • 공격
  •  
  • 16장: 함수 포인터 변조(I)
    • 문제 파악
    • 의도 분석
    • 공격
    • 환경변수를 이용한 버퍼 오버플로우
  •  
  • 17장: 함수 포인터 변조(II)
    • 문제 파악
    • 의도 분석
    • 공격
  •  
  • 18장: 포인터 활용
    • 문제 파악
    • 의도 분석
    • 공격
    • printf() 함수의 서식 문자
  •  
  • 19장: 공유 라이브러리를 이용한 버퍼 오버플로우
    • 문제 파악
    • 의도 분석
    • 공격
    • setreuid(3100, 3100) 함수를 셸코드로 만들기
  •  
  • 20장: 포맷스트링 복습
    • 문제 파악
    • 의도 분석
    • 공격
  •  
  • 21장: 배시셸을 실행하는 경량 셸코드 제작
    • 문제 파악
  •  
  • 22장: 리버스로 배시셸을 연결하는 경량 셸코드 제작
    • 문제 파악
  • 41쪽, 그림 1.2
    • Stack 지역변수의 맨 마지막에 있는 input[29] 삭제
  • 43쪽, 그림 1.4.2
    • clear 값과 /home/level2 값의 주소값은 모두 0x8048720이 아닌 0x8048726으로 수정
  • 44쪽, 그림 1.5
    • "레벨 2의 권한으로..." 값의 주소는 0x8048720이 아닌 0x8048740로 수정
  • 46쪽(그림 1.7 문자열의 메모리)
  • 48쪽(그림 1.8 문자열의 메모리 구성)
  • 49쪽(그림 1.9 문자열의 메모리 구성)
  • 51쪽(그림 1.12 문자열의 메모리 구성)에 있는 주소와 스택란의 값을 각각 다음과 같이 수정합니다.
    • 주소 부분: $EBP - 0xffffffd8 --> $EBP + 0xffffffd8
    • 스택 부분: $EBP + 0x28 --> $EBP - 0x28
  • 52쪽, setreuid(3002, 3002);의 주석 부분
    • level2의 Group ID 부여 --> level2의 User ID 부여
  • 54쪽, ls 입력하는 부분
    • ls --> id
  • 47쪽, 위에서 3번째 줄
    • 주소 부분의 $EBP - 0xffffffd8 --> $EBP + 0xffffffd8
    • 스택 부분의 $EBP + 0x28 --> $EBP - 0x28
  • 296쪽, 315쪽

    • 독자 문의: NOP의 개수가 NOP(219)가 아닌 NOP(223)여야 하지 않을까요?
    • 저자 답변: p.292에서 버퍼 공간이 264바이트로 확보된 것을 볼 수 있고, RET는 272에 있기 때문에 296p에서 272 바이트를 만들기 위해 명령어로 할 때는 223+49로 272를 만들었고,익스플로잇에서는 219+45+4+4로 272를 만듭니다.
  • 41페이지 그림1.2 메모리구조에서 Stack 지역변수의 제일 마지막에 있는 input[29] 는 삭제되어야 합니다.

  • 43페이지 그림1.4.2 문자열의 메모리 구성에서 clear 값과 /home/level2 값의 주소값이 모두 0x8048720 대신 0x8048726으로 표시되어야 함

  • 44페이지 그림 1.5 문자열의 메모리 구성에서 "레벨2의 권한으로.." 값의 주소가 0x8048720 대신 0x8048740으로 표시되어야 함

  • 52페이지에서 setreuid(3002, 3002);의 주석부분에 level2의 Group ID 부여 라고 되어있는데, Group ID가 아니라 UserID가 맞음

  • 54페이지의 [04 공격] 목차 위에 ls 입력하는 부분에서 ls가 아니라 id가 맞음

예제코드 관련 GitHub 페이지

관련 글