堆棧段可讀可寫可執行


代碼段里面是可執行代碼,段屬性可讀可執行不可寫
數據段里是堆/全局變量和靜態變量.....,段屬性是可讀可寫不可執行
堆棧段里面是返回地址/局部變量......段屬性是可讀可寫可執行


這個代碼段可執行我能夠理解,因為里面裝的就是像一條一條的匯編命令,好像是有個什么指針,指針指到那條命令就執行該命令。
請問這個堆棧段說的“可執行”是什么意思?它不是專門放數據的嗎,它里面怎么放命令,我程序編譯后的代碼可執行命令不是都應該放到代碼段嗎,怎么能跑到堆棧段里。 請大家指點一下,小弟先在此謝過了。

 

回答1:

堆棧段也是可以執行的,你說的只是一般情況而已,其實是可以設置頁屬性在堆棧段執行代碼的。
LINUX內核中關於信號部分就有在堆棧中執行的實現。

 

回答2:

不要常規地想這件事,至於代碼段,數據段,堆棧段的概念我就不說了,考慮緩沖區溢出攻擊,其中很有效的一種方式就是棧溢出(還有堆溢出...),當你調用一個函數的時候棧如下:

主調函數的棧幀 -->
esp-->數據(地址為XXXX) 
  ......
  -->局部變量(local)
ebp-->老的棧指針
  -->被調函數的返回地址
  -->函數參數
主調函數的棧幀 -->
  ......
如果局部變量local向下溢出,那么就會覆蓋被調函數的返回地址,如果攻擊者將其攻擊代碼(當然是要用來執行的)放到XXXX處,XXXX也在堆棧中,而且恰好把被調函數的返回地址覆蓋成地址XXXX(需要一定技術),那么當函數返回的時候,執行流就會自覺地進入XXXX開始執行,再強調一遍XXXX在堆棧,但是如果堆棧可執行,那么攻擊者的目的就達到了,若堆棧不可執行,那么程序立馬報錯退出,攻擊者就要考慮別的手段了。至於怎么設置可執行,那就要看硬件和操作系統的實現了,可在段表設置,也可以在頁表設置,對於linux和windows這種平坦模式的段而言,設置堆棧對應的頁表項的可執行位為1或為0代表堆棧可執行或者不可執行

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM