본문 바로가기

스터디/파이썬 해킹 프로그래밍

PyDbg 를 이용한 소프트 후킹

소프트 후킹을 이용해 모질라 파이어 폭스가 데이터를 암호화 시키기 전 데이터를 스니핑 해보자.


파이어폭스는 통상적으로 SSL 암호화를 사용한다.

어느 함수에 후킹을 할 지는 본인의 선택이지만, 여기서는 PR_Write 함수에 후킹을 설정한다.


이 함수가 호출되면 ESP+8을 통해 암호화 되기 전의 아스키 문자열에 대한 포인터를 얻을 수 있다. ESP 레지스터로부터 오프셋+8의 위치라는 것은 (오프셋이란 거리를 이야기 한다.)

아스키 문자열이 PR_Write 함수에 두 번째 파라미터로 전달된다는 의미이다. 

--> 암호화 되기 전 아스키 문자열을 스니핑 하기 위해서는, 이 함수를 후킹한다.

(수정) 이 함수를 후킹할 경우, 아스키 문자열을 스니핑 할 수 있다.


파이어폭스 웹 브라우저를 열고 https://www.openrce.org/ 로 이동하여 실험해본다.

사이트에 SSL 인증을 동의하면 페이지가 로드된다. 그 후 firefox 프로세스에 (firefox.exe) Immunity 디버거를 attach 하고 브레이크 포인트를 설정한다.

그 후 아이디/패스워드를 입력하고 난 후에 로그인을 하면. 브레이크 포인트가 작동한다.

결국 다음과 같은 문자열을 가리키는 포인터를 스택을 통해 볼 수 있다.


[ESP+8] => ASCII "username=test&password=test&remember_me=on"


사용자 이름과 비밀번호가 암호화 되기 전 문장으로 그대로 볼 수 있다.

하지만 네트워크 레벨에서 (와이어샤크등으로 캡쳐 한 후에 패킷을 보면) SSL 암호화된 문자열 밖에 볼 수 없다. 


PyDbg 로 소프트 후킹을 정의하려면 먼저 모든 후킹 객체를 담을 수 있는 후킹 컨테이너를 정의해야 한다. 다음과 같은 명령으로 후킹 컨테이너를 초기화한다.


hooks = utils.hook_container()


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


add 의 첫번째 파라미터는 Pydbg 객체, 

두 번째 파라미터는 후킹을 설정할 주소, 

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

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

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



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


entry 콜백 함수의 프로토 타입


def entry_hook(dbg,args):

# hooking code

return DBG_CONTINUE


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

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

 --> 후킹 대상 함수의 리턴 값(EAX 레지스터의 값)을 나타내는 ret 파라미터 하나가 더 있다


def exit_hook(dbg,args,ret):

# hooking code

return DBG_CONTINUE


암호화 되기 전의 네트워크 트래픽 데이터를 스니핑 하기 위해 entry 콜백 함수를 어떻게 사용하는지 살펴보자. firefox_hook.py 라는 새로운 파이썬 파일을 만들어 코드를 입력하자.

(코드 파일 참고)



코드는 

PR_Write 함수에 후킹을 설정하고 그 함수가 호출되면 두 번째 파라미터로 전달된 문자열 포인터를 이용해 아스키 문자열을 읽어들인다. 읽어들인 무자열에 미리 정의한 패턴 문자열이 있으면 해당 문자열을 콘솔에 출력한다.

파이어 폭스를 실행시킨 후 커맨드 라인에서 firefox_hook.py 를 실행시키고 

https://www.openrce.org 사이트를 방문해 로그인을 수행하면 다음과 같은 결과가 출력될 것이다.


[*] Attaching to firefox.exe with PID: 1344

[*] nspr4.PR_Write hookeed at : 0x601a2760

[*] Hooks set, continuing process.

Pre-Encrypted: username=test&password=test&remember_me=on

Pre-Encrypted: username=test&password=test&remember_me=on

Pre-Encrypted: username=jms&password=yeahright!&remember_me=on


소프트 후킹은 간단하면서도 동시에 강력한 후킹 기술이다.

모든 종류의 디버깅이나 리버싱 작업에 적용이 가능한 기술이다.

성능에 민감한 함수 호출에 소프트 후킹을 적용한다면 프로세스의 속도가 느려지고 에러와 같은 예상 외의 현상이 발생하는것을 금방 확인할 수 있다.

이는 INT3 (인터럽트3) 명령이 후킹 코드를 수행하는 핸들러를 호출하기 때문이다. 문제는 그런 작업이 1초에 수천 번 발생하기 때문에, 하드 후킹으로 이러한 단점을 극복할 수 있다.







'스터디 > 파이썬 해킹 프로그래밍' 카테고리의 다른 글

DLL과 코드 인젝션  (0) 2015.02.16
Immunity 디버거를 이용한 하드 후킹  (0) 2015.02.15
질문 정리 (2015-01-26)  (0) 2015.01.26
질문 기록  (0) 2015.01.25
Memory Breakpoint 이론, 함수 정리  (0) 2015.01.18