# -*- 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 |