乐趣区

栈缓冲区溢出(stack Buffer Overrun)引发进程崩溃

一. 问题描述
程序崩溃,如果 1 所示
图 1 进程崩溃图
二. 使用 windbg 调试
使用 windbg attach 上崩溃的进程,执行命令~*kn, 观察所有的线程,其中某个线程(09s)的调用栈如图 2 所示
图 2 9 号线程的调用栈在该线程的调用栈中,出现了__report_gsfailure 函数,此函数的存在是判断此线程出问题的原因。
三.cookie 机制
VS2005 版本开始引入 cookie 机制来检查是否存在缓冲区溢出,cookie 是一个 32 位的整数,存在栈帧起始处 EPB- 4 的位置,当函数返回时,此值与函数刚开始进入时的 cookie 值,如果不同,说明是栈缓冲区被破坏了。这是一个比较严重的错误,因此进程报错,程序停止运行。在此进程中,EBP 的值为 2c87d780,执行命令 dd 可以看到此时栈上 cookie 值,父函数的 EBP 值和函数返回值。
0:009> dd 2c87d780-4 l4
2c87d77c 00000000 2c87d7c8 74ee19f8 2c87d734

其中,00000000 即为 cookie 值。这个问题由于最后一个栈帧中保存了出问题的代码行数,此处代码经排查有较多的 memcpy,然而没有对第三个参数长度进行判断,因此造成了栈缓冲区溢出。
后记
字符串复制或者内存复制的时候,一定记得不要超过源或者目标的最小长度。

退出移动版