[3주] 04장 - 브레이크포인트 확장
PyDbg를 이용하면 사용자 정의 콜백 함수를 구현함으로써
기본적인 이벤트 핸들러를 쉽게 확장시킬 수 있다.
디버깅 대상 프로세스 내부의 이벤트를 실제로 관찰하고 교체해보자
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 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | #-*- coding: utf-8 -*- from pydbg import * from pydbg.defines import * import struct import random #사용자 정의 콜백 함수 def printf_randomizer(dbg): # ESP + 0x8 위치에 있는 counter DWORD 값을 읽어들인다. parameter_addr = dbg.context.Esp + 0x4 counter = dbg.read_process_memory(parameter_addr,4) #read_process_memory는 패킹된 바이너리 문자열 리턴 #언어 언팩먼저 수행 string_addr = struct.unpack("L",counter)[0] #"Loop iteration %d!\n" 문자열의 길이는 20바이트 str_len = 20 #문자열의 주소를 알았고, 해당 문자열의 주소에 문자열 사이즈만큼 얻어옴 counter_string = dbg.read_process_memory(string_addr,int(str_len)) counter_string = struct.unpack(str(str_len)+"s",counter_string)[0] #!\n은 필요가 없으므로 뺌 counter_string = counter_string.split("!\n")[0] #앞에있는 문자열 버리고 숫자만 가져옴 counter = counter_string[15:] print "Counter : %d" % int(counter) #랜덤한 숫자 생성, "Loop iteration" 뒤에 넣어줌 random_counter = str(random.randint(1,100)) #디버깅 대상 프로세스에 임의의 수를 써넣고 프로세스가 계속 실행되게만듬 dbg.write_process_memory(string_addr + 0x0F, random_counter) return DBG_CONTINUE #pydbg 클래스의 인스턴스 dbg = pydbg() pid = raw_input("Enter the printf_loop.py PID:") #해당 프로세스에 디버거 붙임 dbg.attach(int(pid)) #printf_randomizer 함수를 콜백함수로 등록하면서 브레이크포인트를 설정 printf_address = dbg.func_resolve("msvcrt","printf") dbg.bp_set(printf_address, description = "printf_address", handler = printf_randomizer) dbg.run() | cs |
그리고 앞에서 짜놓은 printf_loop.py를 실행하고 printf_random.py에 PID를 써넣자
결과
counter 2까지는 정상적으로 루프를 수행하다가 3~부터 printf_loop의 값이 랜덤하게 나오는 것을 알 수 있다.
'Study > 파이썬 해킹 프로그래밍' 카테고리의 다른 글
[3주] 04장 - 프로세스 스냅샷 (0) | 2015.01.26 |
---|---|
[3주] 04장 - 접근 위반 핸들러 (0) | 2015.01.26 |
[2주] 03장 - 윈도우 디버거 개발 (5) (0) | 2015.01.19 |
[2주] 03장 - 윈도우 디버거 개발 (4) (0) | 2015.01.19 |
[2주] 03장 - 윈도우 디버거 개발 (3) (0) | 2015.01.19 |