自己的理解:
棧溢位指的是程式向棧中某個變數中寫入的位元組數超過了這個變數本身所申請的位元組數,因而導致與其相鄰的棧中的變數的值被改變。
兩個並行條件:程式必須向被操作棧寫入資料&寫入資料沒有被程式良好的控制!
最典型的棧溢位利用是覆蓋程式的返回位址為攻擊者所控制的位址,當然需要確保這個位址所在的段具有可執行許可權。
pie(position independent executable):是乙個針對**段.text, 資料段.*data,.bss等固定位址的乙個防護技術。同aslr一樣,應用了pie的程式會在每次載入時都變換載入基址
小端儲存:小端模式,是指資料的高位元組儲存在記憶體的高位址中,而資料的低位元組儲存在記憶體的低位址中。
payload:「有效載荷,有效負荷,有效載重」---------通俗一點講,在程式的世界裡,payload(有效載荷)就是對於接收者有用的資料!
通過尋找危險函式,我們可以快速確定程式是否有可能出現棧溢位。
常見的危險函式:
輸入:gets,直接讀取一行,忽略'\x00'
scanf,
vscanf
輸出:sprintf
字串:
strcpy,字串複製,遇到'\x00'停止
strcat,字串拼接,遇到'\x00'停止
bcopy
1.相對於棧基位址的的索引,可以直接通過檢視 ebp 相對偏移獲得
2.相對應棧頂指標的索引,一般需要進行除錯,之後還是會轉換到第一種型別。
3.直接位址索引,就相當於直接給定了位址。
一般來說,我們會有如下的覆蓋需求
之所以我們想要覆蓋某個位址,是因為我們想通過覆蓋位址的方法來直接或者間接地控制程式執行流程。
自己寫溢位的基礎,溢位原理 2
jmp call movb 0x0,0x7 esi 輸入0的字串為結尾 mov esi,0x8 esi 構造name陣列,放如字串的位址作為name 0 mov 0x0,0xc esi 構造name 1 為null,name 0 為4位位址,所以偏移為0xc mov esi,ebx 設定資料段開始的...
棧在程式中的應用 棧溢位
我的理解 在程式執行過程中,當要呼叫某個子函式時 將子函式的相關引數壓入棧中 將call指令的下一條指令的位址作為返回位址壓入棧中 將當前ebp入棧 使ebp指向esp所指的位置 重新定位棧底 將esp指向的位址 h 在棧上分配 位元組的空間 可選 將某些暫存器中的值入棧 可選 將某些暫存器中的值出...
棧的基礎操作
棧的定義 define maxsize 100 typedef struct node seastack,pseastack 判斷棧是否為空如果為空,函式返回1 否則,返回0 int isempty pseqstack q 返回棧中被占用空間長度 int length pseqstack q 資料入...