堆棧溢出

堆棧溢出

計算機術語
堆棧是一個在計算機科學中經常使用的抽象數據類型。堆棧溢出就是不顧堆棧中分配的局部數據塊大小,向該數據塊寫入了過多的數據,導緻數據越界,覆蓋了老的堆棧數據。或者解釋為在長字符串中嵌入一段代碼,并将過程的返回地址覆蓋為這段代碼的地址,這樣當過程返回時,程序就轉而開始執行這段自動編譯這段代碼了。堆棧溢出一般在遞歸中産生。堆棧溢出很可能由無限遞歸(Infinite recursion)産生,但也可能僅僅是過多的堆棧層級。
    中文名:堆棧溢出 外文名: 别名: 技術:過程和函數 應用學科:計算機科學 内存:連續内存 地址:固定地址 類别:高級語言 領域:計算機安全

堆棧

堆棧是一個在計算機科學中經常使用的抽象數據類型。堆棧中的物體具有一個特性:最後一個放入堆棧中的物體總是被最先拿出來,這個特性通常稱為後進先處(LIFO)隊列。堆棧中定義了一些操作,兩個最重要的是PUSH和POP。PUSH操作在堆棧的頂部加入一個元素。POP操作相反,在堆棧頂部移去一個元素,并将堆棧的大小減一。

為什麼使用堆棧

現代計算機被設計成能夠理解人們頭腦中的高級語言。在使用高級語言構造程序時,最重要的技術是過程(procedure)和函數(function)。從這一點來看,一個過程調用可以象跳轉(jump)命令那樣改變程序的控制流程,但是與跳轉不同的是,當工作完成時,函數把控制權返回給調用之後的語句或指令。這種高級抽象實現起來要靠堆棧的幫助。堆棧也用于給函數中使用的局部變量動态分配空間,同樣給函數傳遞參數和函數返回值也要用到堆棧。

堆棧區域

堆棧是一塊保存數據的連續内存。一個名為堆棧指針(SP)的寄存器指向堆棧的頂部。堆棧的底部在一個固定的地址。堆棧的大小在運行時由内核動态地調整。CPU實現指令PUSH和POP,向堆棧中添加元素和從中移去元素。堆棧由邏輯堆棧幀組成。當調用函數時邏輯堆棧幀被壓入棧中,當函數返回時邏輯堆棧幀被從棧中彈出。

解決措施

能夠監視malloc,memset,memcpy,free這四個函數的行為(棧就不檢測了,一般棧溢出的情況比較少,也好查。另外new和delete由于水平有限,無法對其監視)。如果發現越界操作,打印出來,繼續執行。也就是說該檢測工具不影響程序的行為。

堆棧溢出攻擊

利用JMPESP的方式

其利用格式是NNNNNNRSSSSS,這裡N=NOP,R=RET(jmpesp的地址),S=ShellCode。就是把緩沖區一直覆蓋成NOP(空指令,什麼都不做),直到原來的EIP位置時,我們填入系統中某個核心dll中的jmpesp的地址,緊跟後面才是我們的ShellCode。

正常情況下,函數返回時,執行RET指令,這等于POP EIP,會把保存的原來程序的EIP的值恢複,從而完成中斷的返回。但在這裡,我們把保存的EIP的值覆蓋了,改寫成了jmp esp的地址。這樣,POPEIP後,EIP=jmp esp的地址,而堆棧指針ESP會往下走,指向ShellCode的開始。程序繼續執行,此時EIP裡的内容是jmp esp,系統執行jmp esp,就正好就跳到我們的ShellCode的地方了。

如果ShellCode是開個端口,那我們就可以遠程連上去;如果ShellCode是下載執行,那我們就可以讓目标機在網頁上下個文件并執行,隻要你想到達的功能,都可以想辦法實現。

利用JMPEBX的方式

其利用格式是NNNNNJESSSSSS。這裡N=NOP,J=Jmp04,E=jmpebx的地址,S=ShellCode。這裡的J和E的位置是關鍵,E是在出錯處理的入口位置,而J在其前面。在第一種方式中,我們知道将返回地址覆蓋成另一個地址。但如果是個無效的地址呢?那裡指向的數據或許不能讀,或許不能執行,那會怎麼樣呢?其實相信大家都遇到過,那就是系統會彈出個對話框報錯,我們點确定,就會終止運行。

這是因為作為一個系統級的程序,内部有健全的出錯處理機制。簡單的說,如果運行時有錯誤産生,windows就會跳到一個專門處理錯誤的地方,對應不同的錯誤,執行不同的代碼。上面執行的代碼就是彈出個對話框報錯。

所以這裡我們故意把返回的地址覆蓋成一個錯誤的地址。這樣出錯時,windows就會跳到處理錯誤的入口,而ebx指向入口前4個字節的地方!那我們把錯誤入口處覆蓋為jmpebx的地址,就會跳到前4個字節,怎麼跳到ShellCode呢?在這裡我們寫入jmp04,哈哈,往後跳4個字節,正好跳過覆蓋值,達到我們的ShellCode。

相關報道

算法安全是AI安全的一個重要組成部分,360AI安全研究院研究員劉昭認為,如果要建立完整的AI安全體系,我們還需要關注AI算法所依賴的基礎設施安全。AI關鍵基礎設施存在容易被忽視的安全問題,如堆棧溢出、未授權訪問、任意文件上傳等,這些安全問題将會導緻嚴重後果,如惡意代碼執行、敏感信息洩露、服務不可用等。

相關詞條

相關搜索

其它詞條