程式碼/軟體如何存取記憶體中不應該存取的位置?

程式碼/軟體如何存取記憶體中不應該存取的位置?

預設情況下,當應用程式運行時,它們被允許存取的 RAM 量受到限制,對嗎?從技術上講,我的 VLC 無法存取 Chrome 使用的記憶體位址。但是作業系統/編譯器怎麼可能錯誤地允許存取程式碼不允許的位址。我知道很多“漏洞利用”和“有效負載”利用這一事實並創建佔用過多空間並“溢出”到其他地址的變量,但這實際上是如何發生的呢?

某些程式是否比其他程式更容易出現這種情況?它們用哪種語言編碼重要嗎?例如,我知道 C 可以使用內存,而 Java 則不允許。

另外,這樣做有什麼好處呢?如果有人編寫惡意程式碼來存取記憶體中的某個位置,他們會做什麼?我唯一能想到的是儲存在 RAM 中的密碼/密鑰。

聚苯乙烯我考慮過將其放入 Stack Overflow 中,但我的問題比僅僅與程式設計視角相關的問題要廣泛得多。如果我把它放在錯誤的地方,我很抱歉。

答案1

奇怪的是,它確實涉及溢出 - a堆疊溢位- 使用精心設計的流程來使用超出應有空間的空間,以改變目標prpgramme的行為,或使其崩潰

答案2

具體一點:通常令人感興趣的「溢出」不允許一個應用程式(進程)覆蓋另一個應用程式(進程);相反,它們只是進程正在處理的數據,導致程式用該數據覆蓋自身的一部分(通常是堆疊,可能是間接的),然後允許接管那個過程

然後該進程可以透過正常的 IPC 和系統呼叫進行交互,以接管您的帳戶有權存取的任何其他內容。 VLC無法用普通位址存取Chrome的記憶體空間,但它能:

  • 假裝是調試器,附加到 Chrome 進程並對其進行修改。
  • 重寫您的任何文件和帳戶設置,以便將來每次登入時都會執行其程式碼。
  • 開啟網路連線並將其自身傳播到其他電腦。

不幸的是,除了偶爾的例外,現代作業系統假設您完全信任您使用帳戶中的所有內容運行的每個程式。自從專家單獨使用非連網分時系統(其中作業系統提供保護)以來,這種假設就不再成立。保護使用者免受彼此的侵害,不是來自他們自己的軟體)。

相關內容