堆溢出问题快速调试

堆溢出问题快速调试首先来看下问题代码,这里最后的空字符发生了溢出。来看一下出现的问题以及如何调试。上面写明是堆链中第41个堆块且地址在0x00382a700出发生了错误。这种情况下别急着终止,点击重试就会断在出问题的位置。点重试后断到了这里往上拉一拉,寻找函数名,或者直接查看调用堆栈发现是断在_free_dbg函数中,这个函数是free()的底层,所以可以断定一定是释放的时候出了问题直接在free()函数上下断点然后运行过去,发现第41块堆块的下溢标志受损了。就是strcpy导致的。

首先来看下问题代码,这里最后的空字符发生了溢出。

堆溢出问题快速调试

来看一下出现的问题以及如何调试。

堆溢出问题快速调试

上面写明是堆链中第41个堆块且地址在0x00382a700出发生了错误。这种情况下别急着终止,点击重试就会断在出问题的位置。

点重试后断到了这里

堆溢出问题快速调试

往上拉一拉,寻找函数名,或者直接查看调用堆栈发现是断在_free_dbg函数中,这个函数是free()的底层,所以可以断定一定是释放的时候出了问题

堆溢出问题快速调试

直接在free()函数上下断点然后运行过去,发现第41块堆块的下溢标志受损了。就是strcpy导致的。

堆溢出问题快速调试

为了验证这一个结果, 我们下一个数据执行断点。可以判定什么时候数据被修改。首先重新调试,步过malloc后目标字节变成了0XDF。到这里位置一切正常

堆溢出问题快速调试

选择Edit后选择BreakPoints,准备设置数据执行断点

堆溢出问题快速调试

我们把那个被覆盖的位置的地址输入

堆溢出问题快速调试

最后,看见了吧,当我设置了这个断点后就不存在之前的问题了。

堆溢出问题快速调试

而当我没有设置的时候这里却被改变。

堆溢出问题快速调试

(完)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/34687.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注