pydbg 모듈을 활용한 API 후킹 - (1) 디버거의 개념과 pydbg 모듈 설치
System/Cybersecurity

pydbg 모듈을 활용한 API 후킹 - (1) 디버거의 개념과 pydbg 모듈 설치

※ 본 포스팅은 <파이썬 해킹 입문 - 공격의 언어 파이썬을 이용한 해킹 연습> (조성문 정영훈 저) 를 기반으로 작성되었습니다.


  지난번에는 Win32 API를 ctypes를 통해서 알아보았다. 이번에는 디버거 모듈인 pydbg를 활용하려 한다. 먼저 디버거의 개념에 대해서 말해보자.


디버거의 개념


  디버거는 프로세스 동작을 잠시 멈추고 실행되는 함수이다. 일종의 인터럽트 서브루틴이라고 할 수 있다. 디버거는 디버깅을 원하는 명령어 부분에 중단점[각주:1]을 설정한다. 그 후 이벤트가 발생하고 있는 현황을 지속적으로 모니터링한다. 디버거를 다 돌리고 나면 프로세스는 다시 원래 하던 대로 움직인다. 운영체제는 명령어를 처리하는 도중에 지정된 콜백 함수를 호출한다.


  보통 디버거를 이용한 해킹에서는 콜백 함수에 원하는 해킹 코드를 입력해 둔다. 대표적으로 API 후킹 (API Hooking) 기법이 있다. API 후킹은 프로그램에서 데이터를 저장하는 함수를 호출할 때 메모리에 있는 값을 변경하면, 파일에 저장되는 데이터를 원하는 방향으로 조작하는 해킹 기법이다.


  Windows 운영체제는 단계별로 Win32 API를 지원한다. ctypes를 이용해서 호출할 수도 있고, pydbg Win32 API를 호출할 수 있다. 아래 과정 중 6, 8번째는 운영체제가 프로그래머가 등록한 정보를 기반으로 동작을 수행하고, 나머지는 프로그래머가 직접 구현해야 하는 부분이다.

① PID 얻기

  Win32 API를 통해 디버깅을 원하는 프로세스의 PID를 얻을 수 있다.

② 명령어 주소 얻기

  해당 프로세스 주소 공간에 매핑하고 있는 모든 모듈의 목록을 조사한다. 그 후 중단점을 지정하고 싶은 함수의 주소를 얻을 수 있다.

③ 중단점 설정


  참고로, 중단점을 원하는 위치에 설정하면, 명령 코드의 처음 2byte가 'CC'로 바뀐다. 디버거는 내부적으로 관리하는 중단점 목록(리스트)에 원본 명령 코드를 저장한다. 이 덕에 원래의 처리 과정으로 돌아가는 데 문제가 없다.


④ 콜백 함수 등록


  중단점이 설정된 명령 코드를 실행하면 디버그 이벤트(Debug Event)가 발생한다. 운영체제는 이 때 인터럽트를 발생시키고, 인터럽트 서브루틴, 즉 프로그래머가 설정한 콜백 함수를 수행하기 시작한다.


⑤ 디버그 이벤트 대기


  Win32 API를 사용해서 디버그 이벤트가 발생하는 것을 그대로 기다린다. 콜백 함수 호출을 기다리는 것이다.


⑥ 디버그 이벤트 발생


  디버깅 대상인 프로세스가 실행 도중에 중단점을 만나게 되면 인터럽트가 발생한다.


⑦ 콜백 함수 실행


  인터럽트가 발생하면 ④에서 등록한 콜백 함수, 인터럽트 서브루틴이 실행된다. 콜백 함수에 심겨진 해킹 코드가 프로그래머가 원하는 동작을 수행한다.


⑧ 프로세스 복귀


  콜백 함수가 종료되면 정상적인 프로세스 흐름이 계속 진행된다.


pydbg 모듈 설치


  Python으로 Windows 응용 프로그램을 해킹하기 위해서는 DLL을 통해 윈도우에서 지원하는 다양한 함수를 활용할 수 있어야 한다. 이전 포스팅에서는 FFI(Foreign Function Interface) 패키지를 기본적으로 지원하고, DLL을 호출해서 C언어 자료형을 사용할 수 있게 하는 ctypes 모듈에 대해서 설명한 바 있었다. ctypes를 사용하면 순수 Python 코드만으로도 확장 모듈을 표현할 수 있는 등 장점이 있지만, Windows DLL을 직접 사용하려면 Windows 함수에 대해 여러모로 알아두어야 하고, 절차가 복잡하다는 단점도 있다. 그래서 이번에는 미리 개발된 Python 모듈인 pydbg 모듈을 사용하고자 한다.

  pydbg는 애플리케이션 해킹이나 리버스 엔지니어링에 많이 사용되는 오픈소스 Python 디버거이다. 페드램 아미니(Pedram Ammini)에 의해 RECON2006에서 소개된 PaiMei 프레임워크의 서브 모듈이다. Paimei는 순수하게 Python으로 개발된 프레임워크이다.  세 개의 코어 컴포넌트[각주:2] pydbg, pGRAPH, PIDA와 확장 컴포넌트 Utilities, Console, Scripts 등으로 구성되어 있다. pydbg는 이 중에서도 강력한 디버깅 기능을 지원하고 콜백 함수 확장을 통해 사용자 정의 기능을 구현할 수 있다.

  설치할 때 갑자기 할아버지 얼굴이 나와도 놀라지 말자 (...) 위 링크에서 첨부파일을 다운받아 PaiMei를 설치한 후, 약간의 추가 작업이 필요하다. 이는 Python 2.7.x 버전과의 호환성을 위해서이다. C:\Python27\Lib\ctypes\__init__.py 파일을 수정한다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
######################################################################
#  This file should be kept compatible with Python 2.3, see PEP 291. #
######################################################################
"""create and manipulate C data types in Python"""
 
import os as _os, sys as _sys
 
__version__ = "1.1.0"
 
from _ctypes import Union, Structure, Array
from _ctypes import _Pointer
from _ctypes import CFuncPtr as _CFuncPtr
from _ctypes import __version__ as _ctypes_version
from _ctypes import RTLD_LOCAL, RTLD_GLOBAL
from _ctypes import ArgumentError
 
from _ctypes import Structure as _ctypesStructure    # Add for Paimei.
from struct import calcsize as _calcsize
class Structure (_ctypesStructure): pass             # Add for Paimei.
 
if __version__ != _ctypes_version:
    raise Exception("Version number mismatch", __version__, _ctypes_version)
cs


  17행과 19행에 있는 코드를 추가했으면 이제 Python 2.7.x 버전용으로 리빌드된 pydasm.pyd 파일을 내려받는다. 그 후 C:\Python27\Lib\site-packages\pydbg 폴더에 복사한다. 기존에 pydasm.pyd 파일이 있다면 덮어씌워도 좋다.

pydasm.pyd

  아래 코드가 오류 메시지 없이 제대로 실행된다면 pydbg가 정상적으로 설치된 것이다.


1
2
import pydbg
print "Hello, pydbg!"
cs


  1. 중단점 (breakpoint) : 소프트웨어 개발에서 프로그램을 의도적으로 잠시 또는 아예 멈추게 하는 장소. 디버깅 목적으로 넣는다. [본문으로]
  2. 컴포넌트 (component) : 프로그래밍의 한 부분을 의미하며 재사용이 가능한 최소 단위.객체지향언어를 사용할 때 자주 사용되며 재사용이 가능하기 때문에 컴포넌트 단위로 분류하거나 이동시킬 수 있다. [본문으로]