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

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

blog 用戶 spa 相對 分布圖 原理 寄存器 最終 連續

原文地址: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覆蓋的棧內存處繼續執行

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