代碼段里面是可執行代碼,段屬性可讀可執行不可寫
數據段里是堆/全局變量和靜態變量.....,段屬性是可讀可寫不可執行
堆棧段里面是返回地址/局部變量......段屬性是可讀可寫可執行
這個代碼段可執行我能夠理解,因為里面裝的就是像一條一條的匯編命令,好像是有個什么指針,指針指到那條命令就執行該命令。
請問這個堆棧段說的“可執行”是什么意思?它不是專門放數據的嗎,它里面怎么放命令,我程序編譯后的代碼可執行命令不是都應該放到代碼段嗎,怎么能跑到堆棧段里。 請大家指點一下,小弟先在此謝過了。
回答1:
堆棧段也是可以執行的,你說的只是一般情況而已,其實是可以設置頁屬性在堆棧段執行代碼的。
LINUX內核中關於信號部分就有在堆棧中執行的實現。
回答2:
不要常規地想這件事,至於代碼段,數據段,堆棧段的概念我就不說了,考慮緩沖區溢出攻擊,其中很有效的一種方式就是棧溢出(還有堆溢出...),當你調用一個函數的時候棧如下:
主調函數的棧幀 -->
esp-->數據(地址為XXXX)
......
-->局部變量(local)
ebp-->老的棧指針
-->被調函數的返回地址
-->函數參數
主調函數的棧幀 -->
......
如果局部變量local向下溢出,那么就會覆蓋被調函數的返回地址,如果攻擊者將其攻擊代碼(當然是要用來執行的)放到XXXX處,XXXX也在堆棧中,而且恰好把被調函數的返回地址覆蓋成地址XXXX(需要一定技術),那么當函數返回的時候,執行流就會自覺地進入XXXX開始執行,再強調一遍XXXX在堆棧,但是如果堆棧可執行,那么攻擊者的目的就達到了,若堆棧不可執行,那么程序立馬報錯退出,攻擊者就要考慮別的手段了。至於怎么設置可執行,那就要看硬件和操作系統的實現了,可在段表設置,也可以在頁表設置,對於linux和windows這種平坦模式的段而言,設置堆棧對應的頁表項的可執行位為1或為0代表堆棧可執行或者不可執行