栈越界

老套路挂GDB看堆栈

#0  0xb6c4f974 in *__GI___errno_location () at errno-loc.c:34

*********

中间重复调用某个函数

*********

#69823 0xb6d16998 in clone () from lib/lib/libc.so.6

 

查看堆栈,发现非常多的调用一个函数,猜测是不是递归越界了

首先看栈顶的位置

首先看下现在寄存器的值

(gdb) f 69823
#69823 0xb6d16998 in clone () from lib/lib/libc.so.6
(gdb) info r
r0             0x49f193c        77535548
r1             0x49f1934        77535540
r2             0x86f01cd8       2263882968
r3             0x5ae2ec 5956332
r4             0x876ff4c8       2272261320
r5             0xb6f5416c       3069526380
r6             0x876ff460       2272261216
r7             0x78     120
r8             0x876fefa0       2272260000
r9             0xa9162cf4       2836802804
r10            0x0      0
r11            0x876fefa0       2272260000
r12            0xfffff9c8       4294965704
sp             0x876fefa0       0x876fefa0
lr             0xb6d16998       3067177368
pc             0xb6d16998       0xb6d16998 

在arm平台下r11类似于x86平台的rbp栈基指针,大小为0x876fefa0      


再看看arm的栈顶指针在哪里

(gdb) f 0
#0  0xb6c4f974 in *__GI___errno_location () at errno-loc.c:34
34      in errno-loc.c
(gdb) info r
r0             0x86f01528       2263881000
r1             0xef0d4f 15666511
r2             0x86f01650       2263881296
r3             0x12f7e8 1243112
r4             0x0      0
r5             0x86f01528       2263881000
r6             0x86f015d0       2263881168
r7             0xef0d4f 15666511
r8             0xb6d7e9c8       3067603400
r9             0x86f01650       2263881296
r10            0x86f01650       2263881296
r11            0x86f0151c       2263880988
r12            0xfffff9c8       4294965704
sp             0x86f00fa8       0x86f00fa8
lr             0xb6c7ab90       3066538896
pc             0xb6c4f974       0xb6c4f974 

栈顶指针为0x86f00fa8


这个栈空间的占用0x876fefa0-0x86f00fa8=7FDFF8

而我们知道,32位linux操作系统上,每个栈会有4kB的保留空间,那么一个默认8M的栈空间

可用大小就是7FC000比我们需要的栈空间要小。

 

为了验证是不是栈空间越界,我们看下elf表

readelf -l core

  LOAD           0x11f74000 0x86f00000 0x00000000 0x01000 0x01000     0x1000
  LOAD           0x11f75000 0x86f01000 0x00000000 0x7ff000 0x7ff000 RWE 0x1000
  LOAD           0x12774000 0x87700000 0x00000000 0x01000 0x01000     0x1000

栈基指针在0x86f00000--0x86f01000之间,栈基指针访问是的一个不能读写的区域。

所以可以确定,死机的原因是递归然后栈越界。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值