책 소개
(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)
목차
목차
- 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로 컴파일하기
- 7.1 원격 스레드 생성
- 8장 퍼징
- 8.1 버그의 유형
- 8.1.1 버퍼 오버플로우
- 8.1.2 정수 오버플로우
- 8.1.3 포맷 스트링 공격
- 8.2 파일 퍼저
- 8.3 추가 고려 사항
- 8.3.1 코드 커버리지
- 8.3.2 자동화된 정적 분석
- 8.1 버그의 유형
- 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 팩커
도서 오류 신고
정오표
정오표
[ p27 8행 ]
x89 아키텍처 → x86 아키텍처
[p.36 : 17행]
GNU 디버거(gbd)
->
GNU 디버거(gdb)
[ p60 상단 코드 9행 ]
만들다. → 만든다.
[ p60 mytest.py 한 행 추가 ]
import mydebugger
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:
continuestatus = 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