[3주] 04장 - 접근 위반 핸들러

Posted by dw0rdptr
2015. 1. 26. 05:48 Study/파이썬 해킹 프로그래밍

접근 위반은 접근할 권한이 없는 메모리에 접근하려고 하거나 허용되지 않은 방법으로 메모리에 접근하려고 할 때

프로세스 내부에서 발생한다.

PyDbg로 예외와 관련된 정보를 얻을 수 있는 함수들을 사용할 수 있다.


strcpy()함수를 이용해 버퍼오버플로우를 발생시키는 프로그램의 접근 위반을 처리하는 PyDbg 스크립트를 짜보자.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
#buffer_overflow.py
from ctypes import *
 
msvcrt = cdll.msvcrt
 
raw_input("Once the debugger is attached, press any key.")
 
buffer = c_char_p("AAAAA")
 
overflow = "A" * 100
 
msvcrt.strcpy(buffer, overflow)
 
 
cs



이제 접근위반을 처리하는 스크립트를 짠다
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#access_violation_handler.py
from pydbg import *
from pydbg.defines import *
 
# Utility libraries included with pydbg
import utils
 
def check_accessv(dbg):
 
    if dbg.dbg.u.Exception.dwFirstChance:
        return DBG_EXCEPTION_NOT_HANDLED
 
    crash_bin = utils.crash_binning.crash_binning()
    crash_bin.record_crash(dbg)
    print crash_bin.crash_synopsis()
 
    dbg.terminate_process()
 
    return DBG_EXCEPTION_NOT_HANDLED
 
pid = raw_input("Enter the Process ID : ")
 
dbg = pydbg()
dbg.attach(int(pid))
dbg.set_callback(EXCEPTION_ACCESS_VIOLATION, check_accessv)
dbg.run()
 
 
 
cs


1. buffer_overflow.py 실행
2. PID 확인
3. access_violation_handler.py 실행하고 PID 입력
4. buffer_overflow.py 프로세스가 계속 실행할 수 있도록 엔터키를 누름

결과

1. 접근위반예외를 발생시킨 명령과 그 명령이 속한 모듈을 알려줌

2. 모든 레지스터의 컨텍스트 정보를 보여줌

3. 예외를 발생시킨 명령어 주위에 잇는 명령을 디스어셈블해 보여줌

4. 예외가 발생했을 때 등록되는 SEH(structured exception handling) 핸들러 리스트를 보여줌