Web安全讀書筆記9 緩衝區溢位漏洞

2021-08-30 12:20:02 字數 2382 閱讀 2460

棧溢位

bool checklogin(char *username,char * password)

字串username超過32個字元,_username緩衝區溢位,攻擊者可以覆蓋棧上已經儲存的返回位址,從而可以執行任意**

堆溢位bool checklogin(char *username,char * password)

堆緩衝區旁邊是臨近其他堆塊的控制結構,堆以雙向鍊錶的形式存在

可能精心設定的值能夠覆寫這個雙向鍊錶的指標而指向自己所需要的值

一位偏移漏洞

fp幀指標指向幀頭

sp棧指標指向棧頂

大部分現代計算機系統使用棧來給程序傳遞引數並且儲存區域性變數。棧是一種在程序映象記憶體的高位址內的後進先出(lifo)的緩衝區。當程式呼叫乙個函式時乙個新的「棧幀」會被建立。這個棧幀包含著傳遞給函式的各種引數和一些動態的區域性變數空間。「棧指標」記錄著當前 棧頂的位置。由於棧指標的值會因為新變數的壓入棧頂而經常的變化,許多實現也提供了一種"幀指標"來定位在棧幀的起始位置,以便區域性變數可以更容易的被訪問。

簡單的說就是幀指標可用於子例程引數傳輸,而棧指標則可用於儲存子程式呼叫的返回位址。

圖3-4 棧中幀結構示意圖

對於函式a呼叫函式b的情況,傳遞給b的引數包含在a的棧幀中。當a呼叫b時,函式a的返回位址(呼叫返回後繼續執行的指令位址)被壓入棧中,棧中該位置也明確指明了a棧幀的結束處。而b的棧幀則從隨後的棧部分開始,即圖中儲存幀指標(ebp)的地方開始。再隨後則用於存放任何儲存的暫存器值以及函式的臨時值

作為乙個例子,我們來觀察下面c程式exch.c中函式呼叫的處理過程。該程式交換兩個變數中的值,並返回它們的差值。

1 void swap(int * a, int *b)

2 6

7 int main()

8 其中函式swap()用於交換兩個變數的值。c程式中的主程式main()也是乙個函式(將在下面說明),它在呼叫了swap()之後返回交換後的結果。這兩個函式的棧幀結構如圖3-5所示。可以看出,函式swap()從呼叫者main()的棧幀中獲取其引數。圖中的位置資訊相對於暫存器ebp中的幀指標。棧幀左邊的數字指出了相對於幀指標的位址偏移值(彙編時候計算位址方便,只要ebp加減偏移量就可以求得變數位址)。在像gdb這樣的偵錯程式中,這些數值都用2的補碼表示。例如,-4被表示成0xfffffffc,-12會被表示成0xfffffff4。

呼叫者main()的棧幀結構中包括區域性變數a和b的儲存空間,相對於幀指標位於-4和-8偏移處。由於我們需要為這兩個區域性變數生成位址,因此它們必須儲存在棧中而非簡單地存放在暫存器中。(重要)

圖3-5 呼叫函式main和swap的棧幀結構

bool checklogin(char *username,char * password)

_username[i]=0;

}這段**複製32b,然後增加終止符。因此,如果使用者名為32b或者更長,空位元組就會寫在緩衝區之外,汙染臨近區域。

這時候,如果棧上臨近區域是呼叫楨的已儲存楨指標(即上圖的儲存的ebp),那麼最後乙個溢位的0將導致它指向_username緩衝區(而不是main的ebp的地方,如上圖),因而指向攻擊者控制的資料,呼叫函式返回時,儲存的ebp被載入到楨指標暫存器ebp上(這個儲存的ebp為0),攻擊者就可以控制執行流程。

整數漏洞 整數溢位與符號錯誤

如果應用程式在執行某種緩衝區操作前對乙個長度值運用某種演算法,卻沒有考慮整數的特點,可能導致整數方面的漏洞

整數溢位

bool checklogin(char *username,char* password)

這段**應用程式求出使用者提交的使用者名稱長度,分配空間+一位元組空位元組,分配緩衝區。

但是,如果使用者提交乙個65535個字元的使用者名稱,就會造成整數溢位。unsigned short的範圍0-65535,如果再增加1個長度,就會迴繞而變為0。於是應用程式分配長度為0的緩衝區,把使用者名稱複製進去,造成堆溢位。

符號錯誤

bool checklogin(char *username,int len,char *password)

如果len為負數,那麼仍然可以和32比較,執行strncpy的**,但是strncpy得len只接受無符號數,所以會將len轉換為無符號的型別,因而負值被當做乙個大的整數處理。如果使用者提交的使用者名稱大於32,那麼緩衝區就會溢位。

這種攻擊需要長度引數由攻擊者控制。

格式化字串漏洞

%n 說明符

int count=43;

int writtern=0;

printf(「the value of count is %d%n.\n」,count,&written);

printf(「%d bytes were printed.\n」,written);

輸出the value of count is 43.

24 bytes were printed.

5m21d緩衝區溢位學習筆記

mysql鏈結字串函式 concat ws 函式,表示concat with separator,即有分隔符的字串連線 group concat 函式,把每一行資料分到乙個組裡顯示出來 搜尋引擎 撒旦 maltego工具 開源的漏洞評估工具 nmap工具 免費的開放的網路掃瞄和嗅探工具包 可以探測存...

讀書筆記unix作業系統設計 資料緩衝區高速緩衝

為了加快系統讀取磁碟 及外設 的速度,在記憶體中開闢一塊區域快取磁碟上的資料,這塊區域為disk cache 即磁碟快取記憶體 本章主要 disk cache的資料結構 讀寫磁碟塊內容的演算法等等。緩衝區包括兩大部分 緩衝頭部和資料區。緩衝頭部用於索引 查詢 記錄緩衝區狀態等,資料區是存放快取的磁碟...

Web安全測試 讀書筆記

安全測試就是要提供證據表明,在面對敵意和惡意輸入的時候,應用仍然能夠充分地滿足它的需求。提供證據 設計反安全的輸入和對軟體進行測試是最難做的事。提供證據過程中較難的部分是創造出可能會造成這種狀況的輸入,然後確定這種狀況是否會發生。滿足需求 安全測試就是要提供證據表明,在面對敵意和惡意輸入的時候,應用...