1. 程式人生 > >關於 [棧溢位後jmp esp執行shellcode] 原理分析

關於 [棧溢位後jmp esp執行shellcode] 原理分析

原文地址:https://blog.csdn.net/lixiangminghate/article/details/53333710

正常情況下,函式棧分佈圖如下:

即,返回地址被改為一段快取區的地址。當函式執行結束,從棧中取返回地址準備執行時,取到的是shellcode的地址,最終跳進shellcode執行。這段shellcode的地址一般被硬編碼為某個地址,這個地址可以存在於程式空間的任何地方,只要有執行許可權。
就像寫程式碼時用絕對路徑讀取配置檔案的內容,偶爾會出錯一樣,為了解決這種錯誤,可能會用相對程式執行時的路徑去獲取配置檔案的內容。硬編碼shellcode的地址也會出錯,於是先人提出一種相對定位shellcode地址

的方法,這就是jmp esp。

這用到了棧指標esp的一個特性:當函式執行ret指令後,Eip暫存器發生了跳轉,但Esp還指向函式形參在棧中的地址。如示意圖:

ret返回前 esp的位置:

相對於Eip的跳躍性----ret以後Eip指向天南地北了,Esp具有相對比較穩定的連續性----至少在剛才棧記憶體的附近。於是,當Eip在後續執行過程中,遇到了jmp esp指令,仍會回到上圖中esp指向的函式形參位置執行,執行shellcode的剩餘部分。
跳轉後,執行的位置確定了,剩下的問題就是尋找使用者可訪問空間中,哪段記憶體地址包含了jmp esp這樣的指令。於是OD可能提供了這樣的外掛,用於尋找這樣的地址,比如找到0x00ABCDEF這個地址上包含了jmp esp指令。於是,棧溢位後,在返回地址處填入0x00ABCDEF。當被溢位的函式執行ret指令時,首先會跳轉到0x00ABCDEF處取指執行。取到的結果是jmp esp,於是Eip被設定成Esp的值---即上圖中本是存放函式形參,現在被shellcode覆蓋的棧記憶體處繼續執行