4.1、拓展断点处理
使用PyDbg只需要构建一个用户模式的回调函数,当收到一个调试事件的时候,回调函数执行我们定义的操作。操作完成后,再将权限交还给调试器,回复被调试的进程。‘
PyDbg设置函数的断点原型如下:bp_set(address,description="",restore=True,handler=None)表示:设置的断点的地址,可选,是否要在断点被触发后重置,指向断点触发时调用的回调函数。
我们在printf()函数上下断点,以便读取printf()输出时用到的参数counter变量,之后用要给1到100的随机数替换这个变量的值最后打印出来。
from pydbg import *
from pydbg.defines import *
import struct
import random
#这是我们自定义的回掉函数
def printf_randomizer(dbg):
#从ESP+0x8读取计数器的值
parameter_addr = dbg.context.Esp + 0x8
counter = dbg.read_process_memory(parameter_addr,4)
#当我们使用read_process_memory时,它返回的是一个二进制的串,我们使用它之前要解压他。
counter = struct.unpack("L",counter)[0]
print "Counter:%d"% int(counter)
#随机产生要给数字并打包成二进制格式,为了嗯能够正确地写入进程。
random_counter = random.randint(1,100)
random_counter = struct.pack("L",random_counter)[0]
#交换我们的随机数然后继续进程
dbg.write_process_memory(parameter_addr,random_counter)
return DBG_CONTINUE
#初始化pydbg类
dbg = pydbg()
pid = raw_input("Enter the PID of the printf_loop.py PID:")
dbg.attach(int(pid))
#设置断点进行调用
printf_address = dbg.func_resolve("msvcrt","printf")
dbg.bp_set(printf_address,description="printf_address",handler=printf_randomizer)
dbg.run()
运行不出正确结果,随机数一直不能插入,,找不出原因,,http://blog.youkuaiyun.com/u012763794/article/details/52174275
当程序尝试访问它没有权限访问的页面或以一种不合法的方式访问内存的时候就会产生访问违例。
PyDbg能很方便的实现一个为例访问处理函数并输出相关的崩溃信息。本次测试的目标为危险的c函数strcpy(),我们用它创建一个会被溢出的程序,接下来我们再写一个简短的PyDbg脚本附加到进程并处理违例。
溢出脚本buffer_overflow.py:
from ctypes impor