记录一个因为栈上非法操作导致栈指针被破坏的例子。
源代码如下:
#include <stdio.h>
#include <string.h>
char name[] = "aabbccddeeffgghhiijjkkllmmnnooppqqrrsstt";
void fun()
{
char buf[3];
strcpy(buf, name);
}
int main(void)
{
fun();
return 0;
}
运行时出现了段错误,然后来看内存转储后得到的内容。
1、首先查看栈帧的内容:
(gdb) bt
#0 0x6a696968 in ?? ()
#1 0x6c6b6b6a in ?? ()
#2 0x6e6d6d6c in ?? ()
#3 0x706f6f6e in ?? ()
#4 0x72717170 in ?? ()
#5 0x74737372 in ?? ()
#6 0xbff60074 in ?? ()
Backtrace stopped: previous frame inner to this frame (corrupt stack?)
栈中所有函数指针全部显示成“?”,从中无法获取任何信息,这种情况可以怀疑是栈缓冲溢出。
然后看最后1行,它就提示我们有可能是栈指针出现的错误,所以我们需要做的事情就是去查看这个栈指针怎么回事。
注:我还在另外一个电脑上实验了这个程序,可能是GDB版本不同还是什么,另外一个电脑上最顶上的几个栈指针是对的,但是可以注意到的一点是它内部有一个函数指针是“__stack_ch