老套路掛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之間,棧基指針訪問是的一個不能讀寫的區域。
所以可以確定,死機的原因是遞歸然後棧越界。