遭遇sprintf导致的堆栈崩溃。不使用sprintf_s()的代价
2009-04-15 18:44
162 查看
问题描述:
一直以来,引擎都运行的很稳定。而且在所有电脑上都很稳定。
但是,唯独一个笔记本不行。引擎在其上一运行就崩掉。
问题分析:
根据生成的dump文件,windbg的分析结果为:
The stored exception information can be accessed via .ecxr.
(c98.da0): Stack buffer overflow - code c0000409 (first/second chance not available)
还有 frame IP 被破坏, (IP是什么来着? 指令地址?忘了,权当作当前frame的基地址吧)可见, 可能是堆栈的基地址被破坏了
查看调用堆栈:
。。。一些系统的dll内部函数
xeyez!funxEyeLoadAllDll( ),
。。。。
问题应该出在funxEyeLoadAllDll这里,
根据windbg提示的出错行,定位到该函数的最后一行!! 可见就是函数返回时,返回失败!
查看该函数的实现:
int funxEyeLoadAllDll( )
{
char * strOldEnv;
strOldEnv = getenv("Path");
// 把插件目录加入到环境变量,以便可以让系统载入DLL时找到插件间依赖的DLL
char newEnv[1024] = {0};
sprintf(newEnv,"Path=%s;.//External;.//USB",strOldEnv);
TCHAR buf[MAX_PATH] = {0};
TCHAR *psz;
GetModuleFileName(NULL, buf, MAX_PATH);
。。。。。。
。。。。。。
} // windbg提示该行出错 <-------------
经分析,可能问题出在 下面代码处,下面代码的意思是,把当前系统的PATH环境变量读入到newEnv中。
由于使用sprintf非安全版,就可能破坏堆栈!
char newEnv[1024] = {0};
sprintf(newEnv,"Path=%s;.//External;.//USB",strOldEnv);
果然, 查看那个笔记本的path变量,居然有10几行,每行有100多个字母!
看来,防御性编程是很有必要的!
不要假设客户的电脑的情况!
还好,现在可以使用windbg+pdb文件调试,要是不能,这样的bug不知会调到什么时候!更要命的是,可能会被黑客攻击
一直以来,引擎都运行的很稳定。而且在所有电脑上都很稳定。
但是,唯独一个笔记本不行。引擎在其上一运行就崩掉。
问题分析:
根据生成的dump文件,windbg的分析结果为:
The stored exception information can be accessed via .ecxr.
(c98.da0): Stack buffer overflow - code c0000409 (first/second chance not available)
还有 frame IP 被破坏, (IP是什么来着? 指令地址?忘了,权当作当前frame的基地址吧)可见, 可能是堆栈的基地址被破坏了
查看调用堆栈:
。。。一些系统的dll内部函数
xeyez!funxEyeLoadAllDll( ),
。。。。
问题应该出在funxEyeLoadAllDll这里,
根据windbg提示的出错行,定位到该函数的最后一行!! 可见就是函数返回时,返回失败!
查看该函数的实现:
int funxEyeLoadAllDll( )
{
char * strOldEnv;
strOldEnv = getenv("Path");
// 把插件目录加入到环境变量,以便可以让系统载入DLL时找到插件间依赖的DLL
char newEnv[1024] = {0};
sprintf(newEnv,"Path=%s;.//External;.//USB",strOldEnv);
TCHAR buf[MAX_PATH] = {0};
TCHAR *psz;
GetModuleFileName(NULL, buf, MAX_PATH);
。。。。。。
。。。。。。
} // windbg提示该行出错 <-------------
经分析,可能问题出在 下面代码处,下面代码的意思是,把当前系统的PATH环境变量读入到newEnv中。
由于使用sprintf非安全版,就可能破坏堆栈!
char newEnv[1024] = {0};
sprintf(newEnv,"Path=%s;.//External;.//USB",strOldEnv);
果然, 查看那个笔记本的path变量,居然有10几行,每行有100多个字母!
看来,防御性编程是很有必要的!
不要假设客户的电脑的情况!
还好,现在可以使用windbg+pdb文件调试,要是不能,这样的bug不知会调到什么时候!更要命的是,可能会被黑客攻击
相关文章推荐
- (转) 遭遇sprintf导致的堆栈崩溃。不使用sprintf_s()的代价
- IOS 崩溃使用 info malloc-history 来看堆栈
- KVO使用不当导致的崩溃
- 使用uploadify导致谷歌浏览器崩溃的问题
- iOS --- 使用runtime解决3D Touch导致UIImagePicker崩溃的问题
- 使用 symbolicatecrash 解析崩溃堆栈
- 基本c功能使用不当导致崩溃
- 本周遭遇了 powerdesigner 12.5 导致 office 2007 使用不正常现象
- 格式程序VC中scanf/sscanf不支持%hhx格式,若使用将可能导致程序错误甚至崩溃
- 执行一个shell脚本而导致虚拟机centos6崩溃,慎重使用root权限
- memset内存越界导致函数堆栈崩溃的例子
- VC6下使用STL注意:不要让内存分配失败导致您的旧版 STL 应用程序崩溃
- linux中修改环境变量之后导致系统崩溃(用户所有命令不能使用)的解决办法
- STM32F429同时使用LTDC和外部SDRAM作堆栈导致HardFault死机
- 在c++的struct中使用类成员导致android下崩溃-SIGSEGV
- 使用隐式转换auto_ptr导致程序崩溃原因
- cocos2dx 2.2.6 使用 HttpClient 可能导致部分新设备崩溃的问题
- ios 使用运行时规避数组等越界导致程序崩溃
- MFC项目使用webbrowser控件,点击载入的页面里的文件下载链接后导致程序的崩溃问题的解决方案
- 在Ubuntu上,使用SWT嵌入AWT/SWING代码导致Eclipse崩溃问题