现在,回到前言的栈,看一下能不能用上面的规律来恢复它的栈。前言的可执行文件是没有使用-fomit-frame-pointer
编译选项的。
前言的栈是这样的:
(gdb) bt
#0 0x6f745374 in ?? ()
#1 0x57735571 in ?? ()
#2 0xbff80065 in ?? ()
Backtrace stopped: previous frame inner to this frame (corrupt stack?)
先看一下ebp
,esp
的值:
(gdb) i r ebp esp
ebp 0x6f4e6e61 0x6f4e6e61
esp 0xbff8ef60 0xbff8ef60
毫无疑问,ebp
的值是非法的。从前几节的规律可以知道,ebp >= esp
。
那么,只能看一下esp
所指向的栈内容,来查找函数桢指针fp
。
在找fp
之前,先复习一下栈布局的单链表规律:
-
fp
所在地址大于esp
的值 -
fp
下一个单元的内容可以用info symbol
来显示出函数名称 -
fp
所指向单元也遵守1
,2
两个原则。
看一下esp
所指向的内容:
(gdb) x /16x $esp
0xbff8ef60: 0x57735571 0xbff80065 0xb778d590 0x43647dc3
0xbff8ef70: 0xbff8ef90 0x4361d3e0 0xbff8ef98 0x08048618
0xbff8ef80: 0x00000003 0xbff8f66b 0xffffffff 0x43647dc3
0xbff8ef90: 0x43622960 0xb778dbb8 0xbff8efb8 0x08048636
由于esp
的值是0xbff8ef60
,里面有0xbff8ef90
,0xbff8ef98
,0xbff8f66b
和0xbff8efb8
都满足第1
原则。看一下它们下一个单元满足第2
原则不。
(gdb) info symbol 0x4361d3e0
No symbol matches 0x4361d3e0.
(gdb) info symbol 0x08048618
wrapper2(int, char*) + 28 in section .text of /home/buckxu/work/9/1/xuzhina_d