Top

[프로그래머라면 누구나 할 수 있는]
파이썬 해킹 프로그래밍

  • 원서명Gray Hat Python: Python Programming for Hackers and Reverse Engineers (ISBN 9781593271923)
  • 지은이저스틴 지이츠
  • 옮긴이윤근용
  • ISBN : 9788960771161
  • 25,000원
  • 2010년 01월 04일 펴냄
  • 페이퍼백 | 280쪽 | 188*245mm
  • 시리즈 : 해킹과 보안

책 소개

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

해커와 리버스 엔지니어가 꼭 알아야 할 손쉽고 빠른 파이썬 해킹 프로그래밍. 디버거, 트로이목마, 퍼저, 에뮬레이터 같은 해킹 툴과 해킹 기술의 기반 개념을 설명하며, 기존 파이썬 기반 보안 툴의 사용법과 기존 툴이 만족스럽지 않을 때 직접 제작하는 방법도 알려준다.


[ 소개 ]

파이썬은 쉽고 빠르게 작성할 수 있고 로우레벨을 지원하며 해커들을 행복하게 해주는 다양한 라이브러리를 제공한다는 장점 때문에 해커와 리버스 엔지니어, 소프트웨어 테스터들이 애용하는 프로그래밍 언어로 자리잡았다. 하지만 파이썬을 이용한 해킹 방법을 설명하는 참고서적은 드물었기에, 관련 포럼에 올라온 글이나 도움말을 뒤지거나 코드가 제대로 동작하도록 일일이 코드를 수정해가면서 확인해야만 했다.

『파이썬 해킹 프로그래밍』은 디버거, 트로이목마, 퍼저, 에뮬레이터 같은 해킹 툴과 해킹 기술의 기반 개념을 설명한다. 또한 기존 파이썬 기반 보안 툴의 사용법과 기존 툴이 만족스럽지 않을 때 직접 제작하는 방법도 배울 수 있다.


[ 이 책에서 다루는 내용 ]

■ 지루하고 힘든 리버싱과 보안 분석 작업의 자동화 노하우
■ 자신만의 디버거 제작 방법
■ 퍼저 작성과 윈도우 드라이버 퍼징 방법
■ 코드와 라이브러리 인젝션 기술, 소프트 후킹과 하드 후킹 기술
■ 암호화된 웹 브라우저 세션의 보안 트래픽 스니핑
■ PyDbg, Immunity 디버거, Sulley, IDAPython, PyEmu 사용법


[ 추천의 글 ]

Immunity 사에서 가장 자주 듣는 말은 “아직도 다 안 됐어?”란 말이다. 이 말은 사실 “나는 Immunity 디버거용 ELF 임포터 작업을 하고 있는데, 넌 아직 다 못 했어?”라거나 “방금 인터넷 익스플로러 버그를 또 찾아냈는데, 넌 아직도 공격 코드 작성 못 했어?”라는 의미다.

이처럼 신속한 개발과 수정 작업을 원한다면 차기 보안 프로젝트에서는 반드시 파이썬을 선택하라. 파이썬은 이 같은 요구를 완벽히 충족시켜 줄 것이다.

공구 상가 거리를 거쳐 사우스 비치(South Beach)에 있는 이곳 에이스 하드웨어(Ace Hardware)까지 걸어 내려오는 길은 정말 현기증이 날 지경이다. 그 거리에는 갖가지 물건들을 깔끔하게 진열한 50여 개의 작은 상점들이 있다. 각 상점의 물건은 모두 비슷해 보이긴 하지만 이웃 상점과 비교해보면 모두 매우 중요한 차이점이 있다. 각 공구의 사용 용도를 아는 것만으로는 충분하지 않다. 이는 보안 툴을 만들 때도 마찬가지다. 웹이나 자체 애플리케이션을 개발할 때 경우에 따라 필요한 ‘망치’가 다르다. SQL API를 후킹하는 도구를 후다닥 만들어낼 수 있으면 시간을 많이 절약할 수 있다. 하지만 이것이 툴을 평가하기 위한 요소는 아니다. 일단 SQL API를 후킹할 수 있게 되면 비정상적인 SQL 질의를 탐지할 수 있는 툴을 쉽게 만들 수 있다. 그리고 그 툴을 이용해 공격자가 악용하는 취약점을 빠르게 고칠 수 있다.

보안 연구자들이 한 팀을 이뤄 일하기가 매우 힘들다는 사실은 누구나 알고 있다. 대부분 보안 연구자들은 어떤 문제에 직면하면 먼저 문제를 공격하는 데 사용할 라이브러리를 개발하려고 한다. SSL 데몬에 어떤 보안 취약점이 있다고 하자. 그러면 보안 연구자는 SSL 라이브러리가 매우 다루기 힘들다는 이유로 처음부터 SSL 클라이언트를 개발하려고 할 것이다.

여러분은 무슨 수를 쓰든 이를 피해야 한다. SSL 라이브러리는 보안 연구자의 말처럼 그렇게 다루기 힘든 것이 아니며 특정 보안 연구자의 특정한 스타일대로 작성되지 않은 것뿐이다. 코드 블록을 파헤쳐 문제점을 발견하고 수정할 수 있느냐가 핵심이며, 가능하다면 SSL 라이브러리에 대한 공격 코드를 늦지 않게 작성할 수 있다. 그리고 일이 제대로 진행되려면 보안 연구자들이 팀을 이뤄 일하는 것이 중요하다. 보안 담당자에게 있어 파이썬을 사용할 줄 아는 것이 루비(Ruby)를 사용할 줄 아는 것보다 더 효과적이다. 파이썬을 사용하는 사람들은 기존의 소스코드를 다시 작성하지 않고 서로 협업을 할 수 있기 때문이다. 그렇지 않다면 초유기체적으로 일을 수행해야만 한다. 즉, 부엌에 있는 개미의 수와 문어의 수가 같다고 하더라도 서로 협업하는 개미들을 잡는 것이 문어를 잡는 것보다 훨씬 까다로운 것과 같은 이치다.

이 부분에 있어 이 책은 분명 도움이 될 것이다. 아마 대부분은 필요한 작업을 수행하기 위한 툴들을 이미 갖고 있을 것이다. 이미 비주얼 스튜디오가 있을 테고 그것을 이용해 디버거를 수행할 수 있으며, 더군다나 자신만의 특별한 디버거를 작성할 필요가 없다고 말할 것이다. 또는 WinDbg의 플러그인 인터페이스를 이용하면 된다고 말할 수도 있다. 물론 전부 옳은 말이다. WinDbg는 플러그인 인터페이스를 제공하며, WinDbg API를 이용해 유용한 기능을 만들어낼 수 있다. 하지만 WinDbg를 이용해 5,000명의 다른 사람과 연결해 결과를 서로 관련시킬 수 있다면 더욱 훌륭할 것이라고 아쉬워할 것이다. 반면에 파이썬을 이용하면 XML-RPC 클라이언트와 서버를 만들어내는 것이 약 100라인의 코드만으로 해결된다.

해킹은 리버스 엔지니어링이 아니므로 애플리케이션의 원래 소스코드를 알아내는 것이 목적은 아니다. 프로그램이나 시스템을 개발한 사람보다 더 많이 알아내는 것이 목적이다. 프로그램의 형태에 상관없이 일단 그 프로그램을 이해했다면 흥미진진한 공격 코드를 프로그램에 침투시킬 수 있다. 이는 여러분이 시각화, 원격 동기화, 그래프 이론, 선형 방정식 해법, 통계 분석 기술 등에 대한 전문가가 된다는 의미다. Immunity에서는 파이썬을 표준으로 사용하므로 그래프 알고리즘이나 필요한 툴을 작성할 때 항상 파이썬이 사용된다.

6장에서는 파이어폭스(Firefox)에서 사용자 이름과 비밀번호를 가로채기 위해 어떻게 하면 후킹을 빨리 할 수 있는지 설명한다. 악성 코드 제작자들도 이와 같은 목적을 달성하려고 하이레벨 언어를 사용해 동일한 작업을 수행한다(http://philosecurity.org/2009/01/12/interview-with-an-adware-author). 다른 한편으로는 소프트웨어 검증 툴을 15분 안에 재빨리 만들어낼 수도 있다. 소프트웨어 회사들은 보안상의 이유로 소프트웨어 내부 정보를 보호하기 위해 많은 투자를 한다. 하지만 실제적으로는 복사 방지와 디지털 저작권 관리DRM에 국한돼 있다.

이 책을 통해 여러분은 다른 애플리케이션을 주무를 수 있는 소프트웨어 툴을 빠르게 만들어낼 수 있는 능력을 기르게 될 것이다. 미래의 보안 툴은 빠르게 구현돼야 하고, 빠르게 수정돼야 하며, 빠르게 결합될 수 있어야 한다. 이제 유일하게 남은 질문은 이것이다. “아직도 안 됐어?”

플로리다 주, 마이애미 비치
데이브 에이텔(Dave Aitel)

저자/역자 소개

[ 저자 서문 ]

나는 해킹을 목적으로 파이썬을 배웠다. 나뿐만 아니라 다른 사람들도 모두 해킹을 목적으로 파이썬을 배운다고 과감히 말할 수 있다. 나는 오랫동안 해킹과 리버스 엔지니어링에 알맞은 언어를 찾아왔다. 그런 와중에 몇 년 전 파이썬을 알게 됐고 파이썬은 곧 해킹 프로그래밍 언어 분야에서 독보적인 위치를 차지하게 됐다. 그런데 묘한 점은 다양한 해킹 작업을 수행하기 위해 파이썬을 어떻게 사용해야 하는지를 알려주는 실질적인 매뉴얼이 어디에도 없다는 점이었다. 그래서 관련 포럼에 올라온 글이나 도움말을 뒤지거나 일일이 코드를 수정해 가면서 제대로 동작하는 데 많은 시간을 투자해야 했다. 이 책은 이런 점을 채워주기 위해 파이썬을 써서 해킹과 리버스 엔지니어링을 수행하는 방법을 설명한다.

이 책을 통해 다버거, 백도어, 퍼저, 에뮬레이터, 코드 인젝션 같은 대부분의 해킹 툴이나 기술의 바탕이 되는 이론을 배우게 될 것이다. 또한 자신만의 독특한 솔루션이 필요하지 않은 경우에는 이미 제작된 파이썬 툴만으로도 충분하다는 사실을 알게 될 것이다. 그리고 파이썬 기반 툴의 사용법뿐만 아니라 파이썬으로 툴을 제작하는 방법을 배우게 될 것이다. 하지만 명심해야 할 점은 이 책이 파이썬에 대한 완벽한 레퍼런스가 아니라는 점이다. 이 책에서 다루지 않는 파이썬으로 제작된 정보 보호 툴(infosec tool)도 많이 있다. 그럼에도 불구하고 이 책은 많은 공통 기술을 다루고 있으므로 선택한 어떤 파이썬 툴이든 사용할 수 있고, 디버그할 수 있고, 기능을 확장시킬 수도 있다.

다양한 방법으로 이 책을 읽을 수 있다. 파이썬을 처음 접하거나 해킹 툴 제작을 처음 해본다면 처음부터 끝까지 순서대로 읽기를 권한다. 그러면 책 전반에 걸쳐 몇 가지 필요한 이론과 수많은 파이썬 코드, 해킹과 리버싱 작업 등을 수행하는 다양한 방법을 확실히 이해할 수 있을 것이다. 이미 파이썬에 익숙하고 cyptes 파이썬 라이브러리를 잘 알고 있다면 2장부터 읽기를 권한다. 그리고 이미 경험이 많다면 필요할 때마다 이 책의 코드를 참조하거나 특정 절을 찾아 읽자.

나는 2장에서 디버거에 대한 이론 설명을 시작으로 5장의 Immunity 디버거에 이르기까지 디버거에 많은 분량을 할당했다. 디버거는 해커에게 있어 핵심적인 툴이므로 디버거에 대해 광범위하게 설명하는 것을 주저하지 않았다. 6장과 7장에서는 프로그램 제어와 메모리 조작 같은 디버깅 개념을 추가할 수 있는 후킹과 인젝션 기술을 배운다.

이어지는 장에서는 애플리케이션 공격에 대한 주제를 다룬다. 8장에서는 퍼징을 배우고 기본적인 파일 퍼저를 작성해본다. 9장에서는 강력한 Sulley 퍼징 프레임워크를 이용해 실제 FTP 데몬에 대한 퍼징을 수행해보며, 10장에서는 윈도우 드라이버를 공격하기 위한 퍼저를 어떻게 작성하는지 배운다.

11장에서는 유명한 바이너리 정적 분석 툴인 IDA Pro에서 정적 분석 작업을 자동화하는 방법을 배운다. 끝으로 12장에서는 파이썬 기반 에뮬레이터인 PyEmu에 대해 배운다.

나는 이 책의 코드를 최대한 간결하게 만들고 해당 코드가 어떻게 동작하는지 자세히 설명하려 노력했다. 새로운 언어를 배우거나 새로운 라이브러리를 배워 코드를 실제로 작성하고 오류를 디버깅하는 데는 시간이 필요하다. 독자들이 코드를 직접 작성해보길 권한다.


[ 저자 소개 ]

저스틴 지이츠 (JUSTIN SEITZ)
Immunity, Inc.의 선임 보안 연구원으로, 주로 버그 헌팅, 리버스 엔지니어링, 공격 코드 작성, 파이썬 코드 작성에 대부분의 시간을 보낸다.


[ 옮긴이의 말 ]

파이썬을 이용하면 기존의 C/C++보다 원하는 것을 빠르게 개발할 수 있다. 물론 어떤 것을 개발하느냐에 따라 얘기는 달라질 수 있겠지만 매우 효율적인 프로그래밍 언어라는 점에는 누구도 이의를 제기하지 않을 것이다.

또한 파이썬은 플랫폼 독립적인 프로그래밍 언어다. 즉, 파이썬 인터프리터를 지원하는 플랫폼이라면 어느 플랫폼에서든지 파일썬으로 작성한 프로그램을 실행시킬 수 있다. 윈도우, 리눅스, 맥 OS뿐만 아니라 자바와 닷넷(.NET) 가상 머신에서도 파이썬 프로그램의 동작이 가능하다.

이처럼 파이썬은 장점이 많다. 실제로 많은 보안 업체에서 파이썬으로 각종 툴을 제작해 사용한다. 보안 분야에서는 속도와 효율성이 매우 중요한 요소이며, 이런 요구에 부합하는 것이 바로 파이썬이다. 보안 분야뿐만 아니라 상용 애플리케이션이나 오픈소스 프로젝트에서도 파이썬이 많이 사용된다. 대표적인 예로 비트토렌트(BitTorrent)를 들 수 있다.

이 책은 두껍지 않으면서도 알찬 내용으로 가득 차 있다. 시스템 레벨의 지식이 필요하긴 하지만 책의 내용을 숙지하는 것만으로도 자기 자신의 간단한 디버거, 각종 퍼저, 다양한 모니터링 툴 등을 제작해 사용할 수 있다. 또한 이 책에서 사용되는 예제는 조금만 수정하면 현업에서도 충분히 사용할 만한 툴이 될 수 있다. 그만큼 책의 내용이 실질적이고 구체적이기 때문이다.

끝으로, 독자 여러분 모두가 부디 이 책을 통해 보안 취약점 발견, 디버깅, 후킹 등의 세계에 푹 빠지길 바란다.


[ 옮긴이 소개 ]

윤근용
시스템 프로그래머로서 시스템에 대한 다양한 분야에 관심이 많으며 특히 보안 분야에 대한 관심이 높아 다년간 보안 업무에 종사하고 있다. 바이러스 보안 업체를 거쳐 현재는 NHN에서 보안 관련 프로젝트를 수행 중이다. 에이콘출판사 해킹•보안 시리즈 에디터로서 『웹 애플리케이션 해킹 대작전』, 『실전 해킹 절대 내공』, 『루트킷』, 『리버싱』을 번역했다.

목차

목차
  • 1장 개발 환경 구축
    • 1.1 운영체제 요구 사항
    • 1.2 파이썬 2.5 설치
      • 1.2.1 윈도우에서의 파이썬 설치
      • 1.2.2 리눅스에서의 파이썬 설치
    • 1.3 이클립스와 PyDev 설치
      • 1.3.1 ctypes
      • 1.3.2 동적 라이브러리 이용
      • 1.3.3 C 데이터 타입
      • 1.3.4 레퍼런스를 통한 파라미터 전달
      • 1.3.5 구조체와 유니언 정의
  • 2장 디버거
    • 2.1 범용 CPU 레지스터
    • 2.2 스택
    • 2.3 디버그 이벤트
    • 2.4 브레이크포인트
      • 2.4.1 소프트 브레이크포인트
      • 2.4.2 하드웨어 브레이크포인트
      • 2.4.3 메모리 브레이크포인트
  • 3장 윈도우 디버거 개발
    • 3.1 디버기
    • 3.2 CPU 레지스터 상태 얻기
      • 3.2.1 스레드 리스트
      • 3.2.2 종합
    • 3.3디버그 이벤트 핸들러 구현
    • 3.4브레이크포인트
      • 3.4.1 소프트 브레이크포인트
      • 3.4.2 하드웨어 브레이크포인트
      • 3.4.3 메모리 브레이크포인트
    • 3.5 정리
  • 4장 PyDbg - 순수 파이썬 윈도우 디버거
    • 4.1 브레이크포인트 확장
    • 4.2 접근 위반 핸들러
    • 4.3 프로세스 스냅샷
      • 4.3.1 프로세스 스냅샷 얻기
      • 4.3.2 종합
  • 5장 Immunity 디버거
    • 5.1 Immunity 디버거 설치
    • 5.2 Immunity 디버거 101
      • 5.2.1 PyCommand
      • 5.2.2 PyHooks
    • 5.3 공격 코드 개발
      • 5.3.1 공격 코드에서 사용할 명령 찾기
      • 5.3.2 문자 필터링
      • 5.3.3 윈도우의 DEP 우회
    • 5.4 악성 코드의 안티 디버깅 루틴 무력화
      • 5.4.1 IsDebuggerPresent
      • 5.4.2 반복적인 프로세스 탐지 기법 우회
  • 6장 후킹
    • 6.1 PyDbg를 이용한 소프트 후킹
    • 6.2 Immunity 디버거를 이용한 하드 후킹
  • 7장 DLL과 코드 인젝션
    • 7.1 원격 스레드 생성
      • 7.1.1 DLL 인젝션
      • 7.1.2 코드 인젝션
    • 7.2 백도어 제작
      • 7.2.1 파일 숨기기
      • 7.2.2 백도어 코딩
      • 7.2.3 py2exe로 컴파일하기
  • 8장 퍼징
    • 8.1 버그의 유형
      • 8.1.1 버퍼 오버플로우
      • 8.1.2 정수 오버플로우
      • 8.1.3 포맷 스트링 공격
    • 8.2 파일 퍼저
    • 8.3 추가 고려 사항
      • 8.3.1 코드 커버리지
      • 8.3.2 자동화된 정적 분석
  • 9장 Sulley
    • 9.1 Sulley 설치
    • 9.2 Sulley 프리미티브
      • 9.2.1 문자열
      • 9.2.2 구분자
      • 9.2.3 정적, 랜덤 프리미티브
      • 9.2.4 바이너리 데이터
      • 9.2.5 정수
      • 9.2.6 블록과 그룹
    • 9.3 Sulley를 이용한 WarFTPD 퍼징
      • 9.3.1 FTP 기초
      • 9.3.2 FTP 프로토콜의 골격 생성
      • 9.3.3 Sulley 세션
      • 9.3.4 네트워크와 프로세스 모니터링
      • 9.3.5 퍼징과 Sulley 웹 인터페이스
  • 10장 윈도우 드라이버 퍼징
    • 10.1 드라이버 통신
    • 10.2 Immunity 디버거를 이용한 드라이버 퍼징
    • 10.3 Driverlib - 드라이버 정적 분석 툴
      • 10.3.1 디바이스 이름 알아내기
      • 10.3.2 IOCTL 디스패치 루틴 찾기
      • 10.3.3 IOCTL 코드 찾기
    • 10.4 드라이버 퍼저 작성
  • 11장 IDAPython - IDA Pro 스크립팅
    • 11.1 IDAPython 설치
    • 11.2 IDAPython 함수
      • 11.2.1 유틸리티 함수
      • 11.2.2 세그먼트
      • 11.2.3 함수
      • 11.2.4 교차 참조
      • 11.2.5 디버거 후킹
    • 11.3 스크립트 예제
      • 11.3.1 위험한 함수에 대한 교차 참조 찾기
      • 11.3.2 함수 코드 커버리지
      • 11.3.3 스택의 크기 계산
  • 12장 PyEmu - 스크립트 가능한 에뮬레이터
    • 12.1 PyEmu 설치
    • 12.2 PyEmu 개요
      • 12.2.1 PyCPU
      • 12.2.2 PyMemory
      • 12.2.3 PyEmu
      • 12.2.4 실행
      • 12.2.5 메모리와 레지스터 변경자
      • 12.2.6 핸들러
    • 12.3 IDAPyEmu
      • 12.3.1 함수 에뮬레이트
      • 12.3.2 PEPyEmu
      • 12.3.3 실행 파일 팩커
      • 12.3.4 UPX 팩커

도서 오류 신고

도서 오류 신고

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

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

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

정오표

정오표

[ p27 8행 ]
x89 아키텍처 → x86 아키텍처

[p.36 : 17행]
GNU 디버거(gbd)
->
GNU 디버거(gdb)

[ p60 상단 코드 9행 ]
만들다. → 만든다.

[ p60 mytest.py 한 행 추가 ]
import my
debugger debugger = mydebugger.debugger() pid = rawinput("Enter the PID of the process to attach to: ") debugger.attach(int(pid)) debugger.run() debugger.detach()

[ p67 상단 코드 두 행 추가 ]
def getthreadcontext (self, threadid=NONE, hthread=NONE):   context = CONTEXT()   context.ContextFlags = CONTEXTFULL | CONTEXTDEBUG_REGISTERS

  if not hthread:     self.openthread(thread_id)

  # 스레드의 핸들을 구한다.   hthread = self.openthread(threadid)   if kernel32.GetThreadContext(hthread, byref(context)):     kernel32.CloseHandle(h_thread)     return context   else:     return False

[p. 55 아래에서 2행 코드 들여쓰기]
if exception == EXCEPTIONACCESSVIOLATION:
print "Access Violation Detected."

# 브레이크포인트인 경우에는 내부 핸들러를 호출한다.
elif exception == EXCEPTIONBREAKPOINT:
continue
status = self.exceptionhandlerbreakpoint()

elif exception == EXCEPTIONGUARDPAGE:
print "Guard Page Access Detected."

elif exception == EXCEPTIONSINGLESTEP:
print "Single Stepping."

의 코드를 p. 55의 if debugevent.dwDebugEventCode == EXCEPTIONDEBUG_EVENT: 안으로 들여 쓰기

[p.67 : 예제코드]

->

[p.265 : 찾아보기 G]
gbd
->
gdb