棧越界

老套路掛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之間,棧基指針訪問是的一個不能讀寫的區域。

所以可以確定,死機的原因是遞歸然後棧越界。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章