一.问题描述
程序崩溃,如果1所示
图1 进程崩溃图
二.使用windbg调试
使用windbg attach上崩溃的进程,执行命令~*kn,观察所有的线程,其中某个线程(09s)的调用栈如图2所示
图2 9号线程的调用栈
在该线程的调用栈中,出现了__report_gsfailure函数,此函数的存在是判断此线程出问题的原因。
三.cookie机制
VS2005版本开始引入cookie机制来检查是否存在缓冲区溢出,cookie是一个32位的整数,存在栈帧起始处EBP-4的位置,当函数返回时,此值与函数刚开始进入时的cookie值,如果不同,说明是栈缓冲区被破坏了。这是一个比较严重的错误,因此进程报错,程序停止运行。
在此进程中,EBP的值为2c87d780,执行命令dd可以看到此时栈上cookie值,父函数的EBP值和函数返回值。
0:009> dd 2c87d780-4 l4
2c87d77c 00000000 2c87d7c8 74ee19f8 2c87d734
其中,00000000即为cookie值。
这个问题由于最后一个栈帧中保存了出问题的代码行数,此处代码经排查有较多的memcpy,然而没有对第三个参数长度进行判断,因此造成了栈缓冲区溢出。
注:在没有cookie机制的情况下,如果返回地址处被注入了恶意代码,有可能会产生严重的后果。
后记
字符串复制或者内存复制的时候,一定记得不要超过源或者目标的最小长度。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。