windbg调试内存破坏之栈溢出

当线程覆盖了为其他用途所保留的桟空间时,就是发生了栈溢出Overflow.桟溢出包括覆盖桟帧的返回地址,覆盖整个桟帧,或者消耗尽桟空间等情况。桟溢出将带来各种后果,包括程序崩溃,未预期的行为,甚至严重的安全漏洞。 运行这个程序,如果输入一些短的字符串,那么程序似乎运行起来没有问题。如果输入一个很长的字符串就会导致崩溃。 我们看下崩溃时的状态很奇怪: 乍一看,桟破坏的很严重。我们看下当前的指令指针eip   这块内存的内容是一系列?,代表这不可访问的内存。我们可以假设程序中用于控制执行流程的指令指针可能被破坏了。 我们再看看桟上的内容:   桟上的内容是aaaaaaaaaaaaaaaaa是我们输入的命令行参数。看上去桟上的内容还是正确的。 桟的ret指令会把00610061当作指令的返回地址,程序将从这个返回地址继续执行。但是我们知道00610061是无效的地址。所以崩溃的原因是执行ret指令将导致eip被设置成一个错误的返回地址,如果程序从这个错误的返回地址开始执行,将发生访问违例。 看代码,用字符串复制函数之前的桟是正确的,因此在执行字符串复制期间肯定发生了某个事件导致桟被破坏。从代码中看出HelperFunction如果复制超过MAX_CONN_LEN的字符串将发生桟溢出。 windows驱动开发包里面包含一个PREfast的工具,可以在编译时检测一些代码缺陷。从vs2008开始,已经集成了这个功能。 ... Read More | Share it now!

windbg调试符号与源代码

设置符号路径 查看现有的符号路径 重置本地符号路径 增加一个本地符号路径 增加一个指向微软符号服务器的路径 重置一个指向微软符号服务器的路径 加载调试符号 加载某个符号 重新加载所有符号 重新加载某个符号 打开、关闭显示加载符号过程的详情模式 查看加载的文件与符号 lm命令显示加载模块的信息:lm... Read More | Share it now!