GDB 栈指针 SIGSEGV
(2013-04-15 18:51:33)分类: linux |
运行时出现了段错误,然后来看内存转储后得到的内容。
栈中所有函数指针全部显示成“?”,从中无法获取任何信息,这种情况可以怀疑是栈缓冲溢出。
3、定位源码中的错误。
1、首先查看栈帧的内容:
[html] view
plaincopy
-
(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行,它就提示我们有可能是栈指针出现的错误,所以我们需要做的事情就是去查看这个栈指针怎么回事。
2、查看栈上的内容:
[html] view
plaincopy
-
(gdb)
x/30c $esp-15 -
0xbff6a311:
99 'c' 99 'c' 100 'd' 100 'd' 101 'e' 101 'e' 102 'f' 102 'f' -
0xbff6a319:
103 'g' 103 'g' 104 'h' 104 'h' 105 'i' 105 'i' 106 'j' 106 'j' -
0xbff6a321:
107 'k' 107 'k' 108 'l' 108 'l' 109 'm' 109 'm' 110 'n' 110 'n' -
0xbff6a329:
111 'o' 111 'o' 112 'p' 112 'p' 113 'q' 113 'q' -
(gdb)
p (char *)$esp-20 -
$1
= 0xbff6a30c"\005aabbccddeeffgghhiijjk kllmmnnooppqqrrsstt" -
(gdb)
p (char *)$esp+20 -
$2
= 0xbff6a334"t"
发现在寄存器esp两边都是字符串,问题就出在这里了:
[html] view
plaincopy
-
原来调用函数时推入到栈中的跳转指针被字符串给覆盖了,结果在函数返回的时候,找不到返回的地址,出现了段错误。
3、定位源码中的错误。
在源码中找到上述看到的字符串,然后找到fun函数,经过分析后就可以得到答案了。如果是在几千,几万行代码中又如何定位呢。。真是一个很头疼的事情啊。