Top

소켓 개발 입문자를 위한 백박스 기반의 파이썬 2.7

  • 지은이오동진
  • ISBN : 9788960779068
  • 25,000원
  • 2016년 09월 29일 펴냄
  • 페이퍼백 | 260쪽 | 188*235mm
  • 시리즈 : 해킹과 보안

책 소개

소스 파일은 아래 깃허브 페이지에서 내려 받으실 수 있습니다.
(https://github.com/AcornPublishing/backbox-python)

요약

TCP/IP 프로토콜에 대한 이해와 그것을 필요에 따라 수정할 수 있는 소켓 프로그래밍 지식은 해커의 필수 소양 중 하나다. 이 책은 이러한 사실을 기반으로 진지한 해커로 성장하고자 하는 사람들에게 가장 필요한 소켓 분석과 프로그래밍 지식을 전달하기 위해 집필됐다.

추천의 글

처음 원고 검토를 부탁받았을 때 ‘언제나 지식의 비관주의에 빠져 살던 내가 과연 원고를 검토할 만큼의 실력일까’라는 의문이 들었습니다. 그래서 입문자의 눈으로 원고를 검토하기로 마음 먹었습니다. 즉, 나 자신도 파이썬에 대해 백지 상태라는 기분으로 한 장씩 원고를 읽어 나갔습니다. 원고를 다 읽고 난 뒤 사이버 보안이나 소켓 개발로 입문하고자 하는 사람들이 한 번씩은 꼭 읽어야 할 필요가 있는 책이라고 결론을 내렸습니다.
칼리와 마찬가지로 모의 침투를 위한 백박스 위에서 파이썬을 이용해 소켓 개발을 한다고 하면 엄청난 지식이 필요하다고 생각하겠지만, 이 책 한 권만으로도 무난하게 진행할 수 있습니다. 이 책에서는 파이썬에 대한 기초적인 이론이나 문법, 자료 구조, TCP/IP 이론 등을 하나씩 짚어 가며 설명합니다. 또한, 기초적인 지식이 부족하더라도 구축 환경 구성부터 시작한다면 별다른 어려움 없이 이 책의 내용을 소화할 수 있을 것이라고 생각합니다.
파이썬은 각종 분야에서 폭넓게 사용 가능한 언어입니다. 또한 해커들이 자신의 생각을 표현하는 언어이자 문자이기도 합니다. 이 책을 통해 좀 더 많은 사람들이 진정한 해커로 거듭 성장해 자신의 생각을 파이썬이란 탁월한 언어로 표현할 수 있었으면 좋겠습니다.
- 최정용 / LG 전자 HE 연구소 WebOS TV 개발자

이 책의 특징

■ 파이썬 입문자를 고려해 파이썬 기본 문법을 간결한 예제 중심으로 설명
■ TCP/IP 프로토콜 입문자를 위한 TCP/IP 프로토콜의 핵심 내용 소개
■ 일반 운영 체제가 아닌 모의 침투 운영 체제를 기반으로 소켓을 소개함으로써 침투 도구에 대한 응용 동기 부여

이 책의 대상 독자

■ TCP/IP 프로토콜에 대한 이해를 기반으로 소켓 프로그래밍을 시작하고자 하는 사람
■ 파이썬을 이용해 프로그래밍 지식을 학습하고자 하는 사람
■ 소켓 개발을 시작하면서 소켓 기본 개념을 학습하고자 하는 사람

이 책의 구성

1장, ‘파이썬과 실습 환경 구축’에서는 객체 지향 기반인 범용성 스크립트 언어로서 파이썬의 강점을 설명하고 파이썬 설치 사이트를 소개한다. 파이썬이 처리하는 주요한 데이터 타입의 종류와 객체로서 데이터의 특징을 설명한다. 또한, 파이썬 실습 환경인 백박스 리눅스 개요 설명과 함께 대화식 모드에서의 파이썬 실습 방법을 알아본다.

2장, ‘숫자 데이터 종류와 각종 연산자’에서는 파이썬에서 처리하는 숫자 데이터 종류와 각종 연산자를 설명한다. 특히, 비트 연산자는 소켓 등에서 자주 사용하는 연산자이므로, 확실히 배워두어야 한다. 또한, 내장 함수 중 type() 함수와 divmod() 함수를 설명하고, bin() 함수와 oct() 함수와 hex() 함수 등을 통해 타입 변경에 대한 예제를 살펴본다.

3장, ‘문자열 특징’에서는 시퀀스 데이터 타입의 개념과 속성, 그리고 시퀀스 데이터 타입에서 사용하는 아이템과 인덱스 개념을 다룬다. 시퀀스 데이터 타입의 속성에 따라 문자열의 전반적인 특징을 알아보고, 내장 함수인 str() 함수와 int() 함수 등과 객체 및 참조 변수에 대한 구체적인 예제를 살펴본다.

4장, ‘리스트 특징’에서는 문자열과 리스트의 차이점을 알아보고 시퀀스 데이터 타입의 속성에 따른 리스트의 전반적인 특징을 살펴본다. 또한, 리스트 고유의 내장 함수를 설명하고, 리스트 등과 밀접한 range() 함수와 xrange() 함수의 차이도 살펴본다.

5장, ‘튜플 특징’에서는 리스트와 튜플의 차이점을 알아보고 시퀀스 데이터 타입의 속성에 따른 튜플의 전반적인 특징을 살펴본다. 또한, list() 함수와 tuple() 함수를 이용한 리스트와 튜플 사이의 상호 타입 변경과 그밖에 패킹과 언패킹의 개념, 그에 따른 다중 할당도 설명한다.

6장, ‘해시 특징’에서는 리스트와 해시의 차이점을 설명하고 매핑 타입으로서 해시의 전반적인 특징을 설명한다. 또한, 리스트와 해시와 퓨플의 핵심적인 차이점도 알아본다.

7장, ‘제어문의 종류’에서는 제어문과 들여쓰기의 개념, 조건문 및 반복문 개념에 대한 예제를 살펴본다. 특히, 반복 횟수가 있는 for 문과 반복 횟수가 없는 while 문의 차이점을 알아본다. 그밖에도 반복문에서 사용하는 break 문과 continue 문의 예제도 살펴본다.

8장, ‘함수에 대한 이해’에서는 함수 개념과 형식, 그리고 함수 호출을 알아보고, 사용자 정의 함수에 대한 예제로 파이썬 함수의 전반적인 특징을 설명한다. 함수의 특징 중에서도 특히 기본 인자에 대한 내용이 가장 중요하다.

9장, ‘모듈에 대한 이해’에서는 예제를 통해 파일과 모듈의 차이점을 알아보고, 모듈을 임포트하는 다양한 방법을 살펴본다.

10장, ‘클래스에 대한 이해’에서는 클래스와 그에 따른 멤버 및 메소드에 대해 설명한다. 초기화 메소드와 정적 메소드, 클래스 메소드 등과 같은 특수한 메소드 개념 및 코드 재사용성을 극대화시킨 상속의 개념을 알아본다. 또한, 상속에 따른 다형성과 오버라이딩 기능도 알아본다.

11장, ‘파일 및 예외 처리’에서는 파일 생성 과정과 예외 처리의 개념을 살펴본다.

12장, ‘TCP/IP 프로토콜에 대한 이해’에서는 TCP/IP에 대한 핵심적인 내용을 다룬다. getservbyname() 메소드와 getservbyport() 메소드를 통해 포트 번호 출력 등을 살펴보고, gethostbyname() 메소드와 gethostbyname_ex() 메소드를 통해 IP주소 출력 등을 살펴본다. 또한, pack() 메소드와 unpack() 메소드 등을 통해 비트 변경과 관련한 내용을 알아본다.

13장, ‘송신 과정에서 일련의 데이터 전송 단위’에서는 웹 브라우저에서 웹 서버로 접속하기까지 일련의 과정을 데이터 전송 단위 차원에서 세부적으로 알아본다. 또한, ICMP 요청 과정에서 생성하는 ICMP 전송 단위도 살펴본다.

14장, ‘주요 헤더의 구조와 항목’에서는 소켓 생성 측면에서 주요한 헤더의 구조와 항목의 길이를 알아본다. 헤더의 항목을 참조 변수로 설정할 때 파이썬 데이터 타입에 부합하도록 고려해야 할 내용도 함께 살펴본다.

15장, ‘소켓 관련 주요 모듈의 이해’에서는 소켓 개념과 socket 모듈, struct 모듈, scapy 모듈의 주요한 내용을 알아본다. 특히, 스카피 도구를 통해 패킷 생성 방법 등도 살펴본다.

16장, ‘UDP 기반의 서버와 클라이언트’에서는 자동식 소켓 생성 방식에 따라 UDP 기반의 서버와 클라이언트를 구현해 각각의 특징을 알아본다.

17장, ‘TCP 기반의 서버와 클라이언트’에서는 자동식 소켓 생성 방식에 따라 TCP 기반의 서버와 클라이언트를 구현해 각각의 특징을 알아본다.

18장, ‘상위 계층 기반의 로우 소켓 생성’에서는 상위 계층 기반의 로우 소켓을 생성하기 위한 기초 개념을 알아본다.

19장, ‘하위 계층 기반의 로우 소켓 생성’에서는 하위 계층 기반의 로우 소켓을 생성하기 위한 기초 개념을 알아본다.

20장, ‘ARP 스푸핑 공격 도구’에서는 하위 계층 기반의 로우 소켓을 생성하면서 바인딩하는 경우를 알아본다.

저자/역자 소개

지은이의 말

컴퓨터 언어는 전산학 전공자나 정보 보안 전공자에게는 사실상 모국어와 같다. 전산학 전공자는 알고리즘을 개발하기 위해 언어를 이용하고 정보 보안 전공자는 개발한 알고리즘에서 취약점을 검사하기 위해 언어를 이용한다. 컴퓨터는 분명 하드웨어라는 기계를 기반으로한 장치지만 실제 동작은 언어에 기반하기 때문에 컴퓨터를 다루는 이상 언어에 대한 학습은 절대 피해갈 수 없는 숙명과도 같다. 이것은 마치 수학이 없으면 천문학을 이해할 수 없는 이치와 다를 바 없다.
나는 원래 인문 계열 출신이라 컴퓨터 언어를 접할 기회 자체가 거의 없었다. 가까운 친척이나 지인조차 전산 분야와는 너무나 거리가 먼 사람들이었기 때문에 컴퓨터 언어라는 단어조차 생소했다.
전산 분야로 방향을 튼 이후로 C 언어와 자바 언어 등을 접했지만 성취감보다는 좌절감만 느껴야 했다. 알고리즘 사고가 빈약한 것이 주요한 원인이었고, 다음으로는 학습 방법의 부적응 때문이었다. 특히, C 언어의 경우에는 유닉스 시스템이라는 기계의 구조와 동작을 선행적으로 이해한 상태에서 접근해야 할 언어임에도 이러한 과정을 생략하다 보니 많은 사람들처럼 포인터 부분에서 지루한 교착 상태에 빠지곤 했다. 그러다 결국 중도 포기를 여러 번 반복했다. 자바 언어의 경우에는 객체 지향의 이론은 터득했지만 복잡하게 느껴지는 설정과 군더더기와 같은 소스 코드 등이 거부감으로 작용해 객체 지향의 이론만 머리에 간직한 채 내 스스로 사장시킨 언어였다.
강사로서 나는 늘 찜찜함이 묻어 있는 삶을 사는 기분이었다. 컴퓨터 분야에서 생계를 이어가면서도 자신만의 컴퓨터 언어가 없다는 것은 마치 화장실에서 휴지가 없어 뒤처리를 못한 상황과 다를 바 없었다.
그러다 지난 2012년 중앙 공무원 교육원에서 당시 경찰 수사 연수원 교수로 재직 중이었던 유현 교수님을 통해 ‘백트랙(BackTrack)’과 ‘파이썬(Python)’이란 왠지 멋있어보이는 존재를 처음 알았다. 불혹을 넘긴 나이로 전산 분야의 강사로 살면서 수강생으로부터 백트랙과 파이썬의 존재를 비로소 알았다는 것은 무척 부끄러운 일이었지만 그것은 내 강사 생활에 있어 일대 전환점이기도 했다.
이후 화두를 간직한 채 참선에 열중하는 스님처럼 내 머리에는 늘 백트랙과 파이썬이란 말이 떠나질 않았고 그 때문에 내 관심사는 오직 이 두 개에만 쏠려 있었다. 나는 지도만을 손에 쥐고 마치 보석을 찾아나선 사람처럼 틈만 나면 백트랙 정복에 몰두했다. 그런 나의 고단했던 노력은 작년에 『칼리 리눅스 입문자를 위한 메타스플로잇 중심의 모의 침투』로 결실을 맺었다.
내 생애 처음 출간한 책이었기 때문에 무척 기뻤지만 환희의 포만감은 금방 꺼지고 말았다. 피자는 있지만 콜라가 빠진 식탁에 앉은 기분이었다. 그래서 곧바로 착수한 일이 TCP/IP 분야와 파이썬에 대한 원고 집필이었다.
두 개의 분야를 동시에 집필하는 일은 결코 쉬운 작업이 아니었지만 10년 이상 강의했던 TCP/IP 분야를 기반으로 소켓 프로그래밍을 다루는 작업이었기 때문에 동시 집필 작업에서 일어날 수 있는 난관은 용케도 피해갔다. 내 적성에 가장 부합하는 언어를 모색하는 오랜 방황이 있었던 이유 때문인지는 몰라도 파이썬 기반의 소켓 내용을 다루는 원고 집필은 일사천리로 진행됐다.
4년 전 유 교수님으로부터 처음 들었던 백트랙과 파이썬 덕분에 이제야 비로소 피자와 콜라로 채운 식탁을 차릴 수 있게 됐다.
“Life is too short, You need python(인생은 짧기에 파이썬이 필요해).”라는 말처럼 파이썬의 생명은 간결성이다. 간결성은 곧 경제성이기도 하다. 자바에서는 간단한 문자열을 출력하는 것조차 이러저러한 설정이 있어야 하지만 파이썬에서는 단지 print 문만 있으면 충분하다. 이런 장점 때문에 파이썬은 이미 오래 전에 다양한 분야에서 환영을 받는 언어로 자리매김했다. 특히, 365일 24시간 마치 서버의 동작처럼 일상 대부분을 컴퓨터 앞에 앉아 생활하는 해커들은 파이썬의 장점을 일찍부터 간파해 이미 오래 전부터 보안 진단 도구를 파이썬으로 작성했다. 칼리 또는 백박스 등과 같은 모의 침투 운영체제에 기본으로 내장한 SQLMap이나 SET(Social Engineer Toolkit) 등이 대표적인 파이썬 기반의 도구들이다.
이 책은 파이썬 기반으로 소켓 프로그래밍을 시작하려는 사람들을 대상으로 한다. 따라서 최소한 프로그래밍에서 사용하는 변수나 함수 개념 정도는 알고 있으며, TCP/IP 이론을 어느 정도 아는 사람에게 적합한 책이다. 이 말을 뒤집어 말하면, 프로그래밍에 대한 개념이나 TCP/IP 이론을 전혀 모르는 사람에게는 별다른 감흥이 없을 수도 있다는 말이다.
2장부터 11장까지는 파이썬에서 사용하는 문법을 중심으로 설명한다. 문법 내용을 다시 세부적으로 구분하면, 2장부터 6장까지는 파이썬에서 처리하는 데이터 타입을 설명하고, 7장에서는 제어문을 설명한다. 그리고 8장부터 10장까지 설정 규모에 따라 함수와 모듈, 클래스를 차례대로 살펴보고, 11장에서는 예외 처리에 대해 알아본다. 각 장의 순서는 단계별로 이전 내용을 반영한 내용인 만큼 가급적 순서대로 학습하는 것을 추천한다. 12장부터 14장까지는 소켓 프로그래밍을 위해 반드시 필요한 내용을 다룬다. 특히, 데이터 전송 단위나 각 헤더의 구조는 파이썬 코드에 역점을 두고 설명한다. 독자 여러분들도 TCP/IP 동작 관점이 아닌 코드 구현 측면에서 각 내용을 학습했으면 한다. 15장에서는 본격적인 소켓 프로그래밍을 시작하기에 앞서 핵심적인 관련 모듈 기능을 다양한 예제를 통해 설명한다. 이 중에서 struct 모듈은 C 언어의 API 호출과 관련이 깊다. 따라서 해당 장을 학습하면서 C 언어 기반의 소켓 구조도 함께 확인해 본다면 더욱 좋을 듯하다. 파이썬에서 struct 모듈이 중요한 이유는 비록 파이썬 문법에 따라 소켓을 생성하더라도 실제 소켓 실행은 C 언어로 처리하기 때문이다.
16장부터 20장까지가 본격적인 소켓 프로그래밍을 소개한 내용이다. 이 중 18장과 19장에서는 상위 계층과 하위 계층 측면에서 로우 소켓을 설명한다. 로우 소켓을 생성하기 위해서는 특히 데이터 전송 단위와 헤더 구조를 염두에 둬야 하는 만큼 13장과 14장의 내용을 다시 한 번 확인한 후 시작하는 것이 좋다.
이 책을 통해 파이썬 기반의 소켓 기본기를 터득해 진정한 해커로 도약할 수 있기를 바란다.

지은이 소개

오동진

인천대학교(구 인천전문대학) 일어과와 경희 사이버대학교 컴퓨터정보통신공학(구 정보통신학과)을 거쳐 한국외국어대학교 교육대학원에서 전산교육학 석사를 취득했다. 약 9년 동안 한국통신과 하이텔 등에서 근무했으며, 현재는 경찰 교육원과 한국지역정보개발원 등에서 정보 보안 기사와 모의 침투 분야 등의 강사로 활동 중이다. 저서로는 에이콘출판사에서 출간한 『칼리 리눅스 입문자를 위한 메타스플로잇 중심의 모의 침투』(2015)와 『해킹 입문자를 위한 TCP/IP 이론과 보안』(2016)이 있다.
강의가 없을 때는 문학과 사학, 철학에 대한 책을 읽거나 국가 정보학 같은 책을 읽는다. 사이버 보안 중에서도 모의 침투 운영체제와 사회 공학에 특히 관심이 많다.

목차

목차
  • 01장 파이썬과 실습 환경 구축
    • 1.1 입문자와 전문가 모두를 위한 파이썬 소개
    • 1.2 모의 침투 운영체제로서 백박스 소개
  • 02장 숫자 데이터 종류와 각종 연산자
  • 03장 문자열 특징
  • 04장 리스트 특징
  • 05장 튜플 특징
  • 06장 해시 특징
  • 07장 제어문의 종류
    • 7.1 조건문
    • 7.2 반복문
  • 08장 함수에 대한 이해
  • 09장 모듈에 대한 이해
  • 10장 클래스에 대한 이해
  • 11장 파일 및 예외 처리
  • 12장 TCP/IP 프로토콜에 대한 이해
  • 13장 송신 과정에서 일련의 데이터 전송 단위
  • 14장 주요 헤더의 구조와 항목
  • 15장 소켓 관련 주요 모듈의 이해
  • 16장 UDP 기반의 서버와 클라이언트
  • 17장 TCP 기반의 서버와 클라이언트
  • 18장 상위 계층 기반의 로우 소켓 생성
  • 19장 하위 계층 기반의 로우 소켓 생성
  • 20장 ARP 스푸핑 공격 도구
  • 부록 A SocketServer 모듈을 이용한 서버 구현
  • 부록 B nmap 모듈을 이용한 포트 스캔

도서 오류 신고

도서 오류 신고

에이콘출판사에 관심을 가져 주셔서 고맙습니다. 도서의 오탈자 정보를 알려주시면 다음 개정판 인쇄 시 반영하겠습니다.

오탈자 정보는 다음과 같이 입력해 주시면 됩니다.

(예시) p.100 아래에서 3행 : '몇일'동안 -> 며칠동안

정오표

정오표

2016. 10. 6 수정 사항

[p.73: 2행]
열쇠(Key)와 값(Value)으로
->
키(Key)와 값(Value)으로

[p.75: 13행]
해시 아이템을 추가는 예제 6.3과 같다.
->
해시 아이템을 추가하기 위해서는 예제 6.3를 참고하자.

[p.80: 11행]
If 문부터 콜론까지를 헤더(Header)라고 부른다.
->
if 문부터 콜론까지를 헤더(Header)라고 부른다.

[p.85: 14행]
range() 함수가 아닌 리스트 데이터 또는 튜플 등을 적용할 수도 있다.
->
range() 함수가 아닌 리스트 또는 튜플 등을 적용할 수도 있다.

[p.93: 2행]
예제 8.9를 통해 구체적인 일례를 확인해 보자.
->
예제 8.5를 통해 구체적인 일례를 확인해 보자.

[p.113: 1행]
@classmethod라는 장식자를 이용해 work()가 정적 메소드임을 명시한다.
->
@classmethod라는 장식자를 이용해 work()가 클래스 메소드임을 명시한다.

2016. 10. 26 수정 사항

[p.113: 10~13행]
일반 메소드는 예제 10.2와 같이 첫 번째 매개변수 self를 통해 인스턴스 객체 man 또는 woman 등을 받지만 클래스 메소드에서는 첫 번째 매개변수로 클래스 객체를 받는다. 클래스 메소드를 호출하면 첫 번째 매개변수에 해당 클래스 객체가 자동으로 전해진다.
->
일반 메소드는 예제 10-2와 같이 첫 번째 매개 변수 self를 통해 인스턴스 객체 man 또는 woman 등을 받지만 "정적 메소드"에서는 첫 번째 매개 변수로 클래스 객체를 받는다. "정적 메소드"를 호출하면 첫 번째 매개 변수에 해당 클래스 객체가 자동으로 전해진다.

2016. 10. 31 수정 사항

[p.188: 3행]
또한, address[0]
에는 출발지 IP 주소가 담겼고 str(address[1]
)에는 출발지 IP 주소가 담겼다.
->
또한, address[0]
에는 출발지 IP 주소가 담겼고 str(address[1]
)에는 "출발지 포트 번호"가 담겼다.

2017. 1. 10 수정 사항

[p.189: 예제 16-4]
서버가 재송신한 문자열을 수신하겠다는 설정이다.
root@backbox:/tmp# python udpclient.py
->
서버가 재송신한 문자열을 수신하겠다는 설정이다.
s.close()
root@backbox:/tmp# python udp
client.py