老套路挂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之间,栈基指针访问是的一个不能读写的区域。
所以可以确定,死机的原因是递归然后栈越界。