본문 바로가기
파이썬 스터디 과제/파이썬 해킹 프로그래밍

5장-2 Immunity 디버거 101

by laoching 2015. 1. 25.
728x90
반응형

Immunity 디버거와 사용자 인터페이스를 간단히 살펴보자.

Immunity 디버거를 실행하면

그림과 같은 화면이 나올 것이다.

좌측 상단 CPU 패널 : 프로세스의 어셈블리 코드가 출력됨

우측 상단 레지스터 패널 : 모든 범용 레지스터와 그 외의 CPU 레지스터 내용이 출력됨

좌측 하단 메모리 덤프 패널 : 선택한 메모리 영역의 내용을 16진수 값으로 보여줌

우측 하단 스택 패널 : 스택의 내용을 보여주며 심볼 정보를 갖고 있는 함수의 파라미터를 디코드해 보여준다.

하단 명령 바 패녈 : WinDbg 스타일의 명령으로 디버거를 제어할 수 있는 곳

PyCommand 실행 가능


PyCommand

Immunity 디버거에서 파이썬을 실행시키는 주된 방법은 PyCommend를 이용하는 것이다.

PyCommand란 : 후킹, 정적 분석 등 다양한 디버깅 기능을 Immunity 디버거 내에서 수행하게 작성된 파이썬 스크립트다.

PyCommand 의 구조

-------------------------------------------------------------------------------

from immlib import *

def main(args):

# immlib.Debugger 인스턴스를 만든다.

imm = Debugger()

return "[*] PyCommand Executed!"

-------------------------------------------------------------------------------

모든 PyCommand에는 두 가지 필수 조건이 있다.

1. 하나의 파라미터를 받아들이는 main() 함수 정의

2. 문자열 리턴

문자열을 리턴하면 메인 디버거 상태 바에 출력함.

PyCommand를 실행시키려면 immunity 디버거가 설치된 디렉토리 내의 PyCommand 디렉토리에 해당 스크립트 파일이 존재하는지 확인해야 한다.

-------------------------------------------------------------------------------

!<scriptname>

-------------------------------------------------------------------------------

스크립트가 실행된다.


PyHooks

Immunity 디버거는 13가지 후킹 기능을 지원한다.

각 후킹은 독립적인 스크립트로 구현하거나 실행 시에 pycommand 내부에서 구현할 수 있다.

BpHook/LohBpHook :

브레이크 포인트가 발생될 때 호출된다. BpHook은 디버깅 대상 프로세스를 일시 정지시키지만 LogBpHook은 그렇지 않다.

AllExceptHook :

프로세스 내부에서 종류에 상관없이 예외가 발생하기만 하면 호출된다.

PostAnalysisHook :

디버거가 로드된 모듈에 대한 분석 작업을 끝냈을 때 이 후킹이 호출된다.

디버거의 분석작업이 끝난 후에 자동으로 정적분석 작업을 수행해야 하는 경우에 유용하게 사용 가능하다.

immlib를 이용해 함수와 기본적인 코드 블록을 해석하기 전에 모듈이 먼저 분석돼야 하는 것이 중요하다.

AccessViolationHook :

접근 위반이 발생할 때마다 호출된다. 퍼징 작업을 수행하는 동안에 정보를 자동으로 추적하고자 할 때 유용하게 사용될 수 있다.

LoadDllHook/UnloadDllHook :

DLL이 로드되거나 언로드될 때 호출된다.

CreateThreadHook/ExitThreadHook :

스레드가 생성되거나 소멸될 때 호출된다.

CreateProcessHook/ExitProcessHook :

프로세스가 생성되거나 종료될 때 호출된다.

FastLogHook/STDCALLFastLogHook :

이 후킹 타입은 후킹 코드가 실행되게 만들기 위해 어셈블리 코드를 이용한다.

후킹 코드는 그때의 특정 레지스터 값이나 메모리 주소를 로깅한다. 빈번하게 호출되는 함수를 후킹할 때 유용하게 사용된다.

PyHook을 정의하려면 다음과 같은 템플릿을 이용해야 한다.

LogBpHook

-------------------------------------------------------------------------------

from immlib import *

class MyHook(LogBpHook):

def __init__(self):

LogBpHook.__init__(self)

def run(regs):

#후킹이 호출될 때 시행된다.

-------------------------------------------------------------------------------

LogBpHook을 정의했고 run() 함수도 정의했다.

후킹이 호출되면 run()함수에는 모든 CPU 레지스터 값이 파라미터로 전달된다.

전달되는 레지스터의 값은 후킹이 호출됐을 때의 값으로, 그 값을 조사하거나 원한다면 변경할 수도 있다.

다음과 같이 regs 변수와 레지스터의 이름을 이용해 원하는 레지스터에 접근이 가능하다.

-------------------------------------------------------------------------------

regs["esp"]

-------------------------------------------------------------------------------

pycommand 내에 후킹을 정의해 pccommand를 실행시킬 때마다 호출되게 할 수도 있고 immunity 디버거 디렉토리 내의 pyhooks 디렉토리에 후킹 코드를 위치시켜도 된다.

immlib를 이용하는 스크립트 예제를 보자.


728x90
반응형

댓글