[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申请的大小是一样的,这样就造成了堆溢出。
知道原因后,就可以对代码进行修改了。
分析:
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申请的大小是一样的,这样就造成了堆溢出。
知道原因后,就可以对代码进行修改了。
相关文章推荐
- Android5.0L下因sensorservice crash导致systemserver重启的另外一种场景分析
- Android5.0L下因sensorservice crash导致systemserver重新启动的第二种场景分析
- Android5.0L中SensorService crash导致的systemserver重启问题分析
- 一次Windows上OracleMTSRecoveryService无法启动问题
- 一次Mysql连接池卡死导致服务无响应问题分析(.Net Mysql.Data 6.9.9)
- 一次windows漏洞导致的ora-07445错误整修记录
- Windows Workstation Service远程溢出的分析
- 【Android】【问题分析】G-sensor因数据交互问题导致手机crash
- Windows Workstation Service远程溢出的再次分析
- Windows下分区表破坏导致系统重启
- 朴英敏: 用crash工具分析Linux内核死锁的一次实战
- 一次enq: CF - contention 导致数据库宕机的故障分析
- 还原堆栈信息,分析地形系统使用ASTC格式的纹理导致Crash的问题
- 记录一次因为Android版本不同导致的crash异常:Can't create handler inside thread that has not called Looper.prepare()
- SERVICE_FAILURE_ACTIONS可能导致windows系统不断重启
- 【分析】Windows Workstation Service远程溢出的分析
- 记一次redis挂机导致的服务雪崩事故,不对,是故事~ (非常好的雪崩案例分析)
- 【分析】Windows Workstation Service远程溢出的再次分析
- WLMS.exe (Windows Licensing Monitoring Service)导致系统关机问题
- 一次RegionServer GC导致会话超时下线的原因分析记录