很久以前,曾經寫過一篇關於如何保護棧不可執行的文章《棧的保護--windows和linux》,文章的最後談到了一種很好的方式,就是不用段式保護機制而使用頁式保護機制,在頁表項中做文章,但是這種方式有乙個前提就是頁表項必須支援可執行位,傳統的x86 是不支援的,也就是說傳統的x86處理器僅僅支援讀寫保護,不支援可執行保護,這麼說來如果不用段式保護,純粹的頁式保護是不可能做到保護資料不可執行的。很多文件上說段式機制已經成了雞肋,純粹是為了相容而保留的,現在看來為了實現不可執行保護必須用段式機制,我不知道這是不是x86架構的缺陷,在 linux的源**中,有下列定義:
#define _page_nx (1ull<<_page_bit_nx)
#else
#define _page_nx 0
#endif
#define page_shared_exec /
__pgprot(_page_present | _page_rw | _page_user | _page_accessed)
#define page_copy_noexec /
__pgprot(_page_present | _page_user | _page_accessed | _page_nx)
可以看出,傳統的x86處理器是不支援nx位的,但是看看ppc,是支援的。因此x86處理器下的個人pc會危機重重,更嚴重的是一片混亂,**中到處掛鉤子而沒有什麼好的底層機制可以禁止,不管是病毒還是安全軟體本身都是都採用了一些不太雅觀的方式,也許是以暴制暴吧,另外僅僅由於頁表項沒有支援nx位,這樣就多了幾種緩衝區溢位的方式,可是正是由於x86的這種亂七八糟的鬆散設計才使得很多安全廠商得以生存,因為它們和惡意**在同一條船上。
x86架構的乙個瑕疵 可執行保護
很久以前,曾經寫過一篇關於如何保護棧不可執行的文章 棧的保護 windows和linux 文章的最後談到了一種很好的方式,就是不用段式保護機制而使用頁式保護機制,在頁表項中做文章,但是這種方式有乙個前提就是頁表項必須支援可執行位,傳統的x86 是不支援的,也就是說傳統的x86處理器僅僅支援讀寫保護,...
x86架構實模式和保護模式
實模式 real model 保護模式 protected model cs code segment 段 ds date segment 資料段 es extra segment 附加段 ss stack segment 棧段 保護模式又稱虛擬位址保護模式,與之相對的是實模式。保護模式是在8028...
x86架構下的函式引數
這裡就拿x86 64架構下來舉例子,在這個架構下分別用rdi,rsi,rdx,rcx,r8,r9作為第1 6個引數。rax作為返回值 當我們去呼叫函式的時候 long test long a,long b,long c long sum long a,long b,long c,long d,lon...