python灰帽子-PyDBG纯PYTHON调试器

本文介绍了如何使用PyDbg进行Python调试,包括设置断点,处理访问违例,以及实现进程快照功能。通过在printf函数下断点并尝试修改变量,展示了断点的使用。同时,通过处理strcpy函数导致的访问违例,解释了如何获取崩溃信息。最后,阐述了如何进行进程快照以恢复到特定状态,以及在发现潜在漏洞时采取的跟踪和修复策略。

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


4.2、处理访问违例

当程序尝试访问它没有权限访问的页面或以一种不合法的方式访问内存的时候就会产生访问违例。

PyDbg能很方便的实现一个为例访问处理函数并输出相关的崩溃信息。本次测试的目标为危险的c函数strcpy(),我们用它创建一个会被溢出的程序,接下来我们再写一个简短的PyDbg脚本附加到进程并处理违例。

溢出脚本buffer_overflow.py:

from ctypes impor
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值