[3주] 04장 - 브레이크포인트 확장

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

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의 값이 랜덤하게 나오는 것을 알 수 있다.