《coredump问题原理探究》Linux x86版3.8节栈布局之栈溢出coredump例子

本文深入探讨了Linux x86架构下栈溢出导致的coredump问题,通过分析栈布局和函数帧指针,揭示了如何根据栈中的规律恢复函数调用栈。文章以一个具体的例子为线索,展示了如何找到返回地址,确定栈溢出的原因,并指出可能的罪魁祸首——不安全的函数使用。通过对汇编代码的解析,揭示了栈溢出的根本原因。
摘要由CSDN通过智能技术生成

现在,回到前言的栈,看一下能不能用上面的规律来恢复它的栈。前言的可执行文件是没有使用-fomit-frame-pointer编译选项的。

前言的栈是这样的:

(gdb) bt
#0  0x6f745374 in ?? ()
#1  0x57735571 in ?? ()
#2  0xbff80065 in ?? ()
Backtrace stopped: previous frame inner to this frame (corrupt stack?)

先看一下ebpesp的值:

(gdb) i r ebp esp
ebp            0x6f4e6e61       0x6f4e6e61
esp            0xbff8ef60       0xbff8ef60

毫无疑问,ebp的值是非法的。从前几节的规律可以知道,ebp >= esp

那么,只能看一下esp所指向的栈内容,来查找函数桢指针fp
在找fp之前,先复习一下栈布局的单链表规律:

  1. fp所在地址大于esp的值

  2. fp下一个单元的内容可以用info symbol来显示出函数名称

  3. fp所指向单元也遵守12两个原则。

看一下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,里面有0xbff8ef900xbff8ef980xbff8f66b0xbff8efb8都满足第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
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值