黑客初級攻擊方法-緩衝區溢出攻擊

1.C++程序運行時棧分析

網上關於C++程序運行時的棧解析文章有很多,在這裡簡單介紹一下,方便後續操作的理解與學習。

黑客初級攻擊方法-緩衝區溢出攻擊

運行時棧

從網上盜了個圖,畫的還是比較生動的。。上圖中EBP代表棧底指針,ESP代表棧頂指針,EIP代表程序執行的下一個位置,我們可以用一個例子來解釋一下這幾個東西東西都是幹什麼的,比如程序

黑客初級攻擊方法-緩衝區溢出攻擊

示例程序

首先運行程序,程序運行後,我們定義了兩個變量a和b,這時a與b變量的指針被壓入棧,a和b變量的語句定義完後,下面改調用方法fun()了,這時候需要把下一條指令的地址提前入棧,就是上面說的EIP,也就是說此時的EIP 等價於圖片中的"return 0"語句的地址,這樣當方法fun執行完後,就可以繼續運行了。

調用方法fun後,EBP從main方法的首地址變更為fun方法的首地址,ESP同理指向EBP,而後開啟了fun方法的新棧,fun方法執行完棧頂元素即為EIP,直接執行EIP地址的指令即可完成程序運行。

2.緩衝區溢出攻擊原理

上面說了一下C++指令的執行棧,這和本文要說的溢出攻擊有什麼關係呢?此時提醒大家應該特別注意EIP,因為當方法執行完以後,彈出的數據會交給EIP,也就是下一條要執行的指令,如果EIP的值可以被修改成我們想要執行的指令地址,比如說想要拿到這臺機器的ROOT權限,然後你懂的。。

黑客初級攻擊方法-緩衝區溢出攻擊

NO ONE IS SAFE

那麼問題來了,怎麼覆蓋EIP??

哦,不小心說出來了,沒錯,就是覆蓋EIP。怎麼覆蓋?

黑客初級攻擊方法-緩衝區溢出攻擊

BUG 程序實例

如上圖所示,定義一個16字節空間的buffer數組,那麼入棧16字節,strcpy就是把str指針指向的數組空間copy到buffer中,那如果str太多了呢?超過16字節呢?那麼也要copy過來(win32),那多了copy到哪裡?往高地址copy,為了達到我們的目的,一直讓他copy到EIP那裡就好了,然後最後修改EIP讓它在方法退出以後執行我們想要做的事,這就是緩衝區溢出的攻擊原理

黑客初級攻擊方法-緩衝區溢出攻擊


分享到:


相關文章: