본문 바로가기

스터디/└ 소스파일들

책 원본 소스파일

# -*- coding: cp949 -*-
from pydbg import *
from pydbg.defines import *

import struct
import random

def printf_randomizer(dbg):
    parameter_addr = dbg.context.Esp + 0x8
    counter = dbg.read_process_memory(parameter_addr,4)

    #read_process_memeory returns binary string
    counter = struct.unpack("L",counter)[0]
    print "Counter: %d" % int(counter)

    random_counter = random.randint(1,100)
    random_counter = struct.pack("L",random_counter)

    return DBG_CONTINUE

dbg = pydbg()

#printf_loop.py ȁ·μ¼½ºG PID
#pid = raw_input("Enter the printf_loop.py PID: ")
f=open("pid.txt",'r')
pid=f.read()
print pid
    

# attach debuger to process
dbg.attach(int(pid))

# printf_randominzer Ȕ¼褠ŝ¹硇Լ茠µȏ¸鼭 º극Lũ ǷNƮ ¼³d
printf_address = dbg.func_resolve("msvcrt","printf")
dbg.bp_set(printf_address,description = "print_address",handler = printf_randomizer)

# launch process
dbg.run()

돌아가지 않는다.


변경 후


# -*- coding: cp949 -*-
from pydbg import *
from pydbg.defines import *

import struct
import random

def printf_randomizer(dbg):
  # parameter_addr = dbg.context.Esp + 0x8  # this line ERROR!!!
    parameter_addr = dbg.context.Esp + 0x4
    print dbg.dump_context()
    counter = dbg.read_process_memory(parameter_addr,4)

    #read_process_memeory returns binary string
    string_addr = struct.unpack("L",counter)[0]

    # "Loop iteration %d!\n" 문자열의 총 길이는 20 bytes
    str_len = 15 + 3 + 2

    # 문자열의 주소를 알았고, 해당 문자열의 주소에 문자열 사이즈 만큼 얻어옴
    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 interation" 뒤에 넣어줌.
    random_counter = str(random.randint(1,100))
    dbg.write_process_memory(string_addr + 0x0F,random_counter)

    return DBG_CONTINUE

dbg = pydbg()

#printf_loop.py 프로세스의 PID
#pid = raw_input("Enter the printf_loop.py PID: ")
f=open("pid.txt",'r')
pid=f.read()
print pid


# attach debuger to process
dbg.attach(int(pid))

# printf_randominzer 함수를 콜백 함수로 등록하면서 브레이크 포인트 설정
printf_address = dbg.func_resolve("msvcrt","printf")
dbg.bp_set(printf_address,description = "print_address",handler = printf_randomizer)

# launch process
dbg.run()

문자열을 추출하는 알고리즘이 변경됨.


'스터디 > └ 소스파일들' 카테고리의 다른 글

hippie_easy.py  (0) 2015.01.26
8시간의 대장정.  (0) 2015.01.26
Memory Breakpoint 까지의 소스  (0) 2015.01.17
Hardware Breakpoint 까지 소스  (0) 2015.01.17
Soft Breakpoint 까지의 소스들  (0) 2015.01.17