這個問題在這里已經有了答案: 計算機如何區分二進制模式是指令還是數字? (2 個回答) CPU 如何知道 RAM 中的地址是否包含整數、預定義的 CPU 指令或任何其他型別的資料? (5 個回答) 計算機如何區分資料和指令? (2 個回答) 處理器/暫存器/記憶體中的資料、地址和指令如何區分? (3 個回答) 處理器在操作碼??和資料之間有何不同?[重復] (2 個回答) 昨天關閉。
我正在閱讀這本書,名為The Shellcoder's Handbook,然后我發現了以下資訊:
現代計算機并沒有真正區分指令和資料。如果處理器可以在它應該看到資料的時候收到指令,它會很高興地執行傳遞的指令。這一特性使系統開發成為可能。
那時我才意識到我們的現代系統是多么脆弱:( 但是這本書有點舊,所以我做了一些研究,但找不到足夠的資訊來滿足我。是否仍然沒有任何方法可以區分資料和說明?
附帶問題
一個典型的裝配檔案包含三個部分:
.text
.bss
和.data
還有其他方法可以區分這些嗎??[無元資料]
uj5u.com熱心網友回復:
簡短的回答是否定的,除非您告訴處理器它正在接收什么,否則它不知道有什么區別。如果執行跳轉到那里(并且頁表允許 exec 權限),那就是代碼。如果加載/存盤指令將它作為資料訪問,它就是資料。(在使用 JIT 編譯將一些機器代碼寫入緩沖區然后跳轉到那里運行它的程式中,這兩種情況都可能發生在相同的記憶體地址上。)
資料位和指令位的一小部分可能是相同的,沒有完整的背景關系就無法區分。
你可以把它推到極致;是01某些資料的一部分還是指令的一部分?
uj5u.com熱心網友回復:
指令是資料。在程式運行之前,構建工具和作業系統將程式視為資料,例如作為資料檔案。為了將程式加載到記憶體中,作業系統將程式的各個部分視為資料,包括.text部分(包含程式代碼/機器代碼指令的部分)。
對于 8 位資料位元組,所有可能的位模式(所有可能的值)都用于表達含義——例如,它們區分 256 個不同的 ascii 符號,或者表示 0..255 或 -128..127 中的數字,或者表示部分一些更大的字編碼。由于指令是資料,因此處理器或其他任何人都沒有固有的方法來區分它們。
然而,話雖如此,現代作業系統和處理器允許保護部分,例如.text,從而防止寫入。
還有其他方法可以區分這些嗎??[無元資料]
不,元資料就是方法。
如果處理器可以在它應該看到資料的時候收到指令,它會很高興地執行傳遞的指令。
這是繁瑣的措辭。我不知道說“它應該看到資料”是什么意思。我可能會說當程式被愚弄執行程式打算作為資料的內容時。
但是現代處理器和作業系統擁有阻止這種情況的技術。將運行時/呼叫堆疊標記為不可執行就是這樣一種方法。這個想法是使用硬體功能將一些程式元資料帶入運行時,這些功能有效地標記具有執行權限(或不具有執行權限)的某些記憶體區域。標記區域或頁面比標記單個機器代碼指令或單個資料位元組更有效。
在此處查看更多資訊:https : //en.wikipedia.org/wiki/Buffer_overflow_protection
uj5u.com熱心網友回復:
代碼和資料可以通過頁表中的執行位在機器級別進行區分。決定因素不能是任何位模式,而是(虛擬)地址。
從統計上講,可以合理地確定位元組流是否可以解釋為有意義的代碼。代碼包含一種結構,例如資料依賴流,其中沒有任何任意或重復的資料;隨機資料可以解釋為mov eax, ebx,但典型的代碼不會包含多次出現的mov eax, ebx; mov eax, ecx; mov eax, edx,這將是一個完全有效的資料序列。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/399951.html
