스터디/└ 소스파일들
책 원본 소스파일
kcrong
2015. 1. 20. 20:16
# -*- 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()
문자열을 추출하는 알고리즘이 변경됨.