棧溢位分析

2021-08-03 08:14:16 字數 1013 閱讀 3958

棧是從高位址向低位址方向增漲,堆的方向相反。

在c語言程式中,引數的壓棧順序是反向的。比如func(a,b,c)。在引數入棧的時候,是:先壓c,再壓b,最後a。在取引數的時候,由於棧的先入後 出,先取棧頂的a,再取b,最後取c。

c語言是不作棧溢位檢查,如下**可以正常編譯執行。

如果函式區域性變數發生棧溢位,就會依次覆蓋重寫ebp(4個位元組)、返回位址(4個位元組)、函式引數。函式的「返回位址」被重寫是非常危險的,因為「返回位址」可能指向了一段惡意**而我們卻毫無察覺。

下面的**中funca的區域性變數發生棧溢位,使得funca的返回位址成為funcb的入口位址。不過幸好在執行的時候發現了這種行為,報告了「segmentation fault」。

#include

#include

#define buflength 2

voidfunca(char* str)

//下面的函式是惡意**

也可以在使用gdb時通過在funcb處設定斷點看到funcb的位址。

gdb>b  funcb

棧溢位問題分析

近日,程式總是莫名其妙的coredump,而且還是在變數定義的時候 如 int a 1 百思不得其解。在這種情況下,只有幾種情況可能出現 記憶體踩踏 棧溢位。在經過長時間的分析確認,肯定不是記憶體踩踏。剩下的就是棧溢位了。linux下一般單個程式棧大小為10m,可用ulimit s查閱。一般情況下,...

經典的棧溢位漏洞分析

c原始碼如下 include includeint main int argc,char ar 系統是ubuntu20.04,使用gdb peda除錯。bss段 bss segment 通常是指用來存放程式中未初始化的全域性變數的一塊記憶體區域。bss是英文block started by symb...

棧溢位和棧記憶體溢位

棧記憶體溢位是指使用者棧的大小最多為8 10mb,分配超過棧大小的變數則會導致棧記憶體溢位。如char c 1024102411 11mb 棧溢位指的是程式向棧中某個變數中寫入的位元組數超過了這個變數本身所申請的位元組數,因而導致與其相鄰的棧中的變數的值被改變。如char c 10 memset c...