您的位置:首页 > 其它

[Windows service crash分析]一次编码转换导致的堆破坏

2017-08-10 17:59 651 查看
问题:有时候发邮件的时候,会导致service crash

分析:

1.收集到dump,先看下栈。发现是在free一块内存的时候crash了,看参数似乎是地址01c9fa25。但是因为这里的参数是windbg从栈里取的,因为64位程序通常前4个参数都会传到寄存器里,所以这里的参数通常都是错的。



2.想要查看实际的内容,可以通过阅读汇编代码,查看寄存器的内容。不过这种方法不推荐,这里我使用的windbg的插件cmkd来查看函数参数。通过windbg插件cmkd的命令查看调用栈:



3.看到了需要需要free的地址是173c7e0,再看一下这个地址的信息。这个block的大小的0x410。所属堆段是0x1730000。在这里已经看到了一些error,

173cbe0似乎被破坏了。



4.再来看下这个堆段的状态:

>!heap -a 1730000



173cbe0是173c7e0的下一个堆块,这里通常第二列代表的是前一个堆块的大小,第三列代表的是本堆块的大小。这样就可以看出173c7d0显示自己的大小是410,但是173cbe0却显示它上一个堆块大小是139a0。所以很明显,这里173cbe0这个堆块的被上一个堆块覆盖了。

5.结合代码看一下:

但是通过分析代码发现在一处编码转换的地方可能导致dest的大小会大于src,但是dest和src申请的大小是一样的,这样就造成了堆溢出。

知道原因后,就可以对代码进行修改了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Windows windbg 堆溢出