今天,我們來講一下內核安全!
本文章僅提供學習,切勿將其用于不法手段!
目前,在滲透測試領域,主要分為了兩個發展方向,分別為Web攻防領域和PWN(二進制安全)攻防領域。在PWN的二進制領域,免殺技術,一直是后滲透利用階段的重要安全技術之一。
想要免殺,需要了解的安全技術知識包括軟件加殼、代碼混淆(例如,使用花指令)、隱匿技術(例如,Rootkit技術)、動態加密等內容。
接上一篇文章,我們來繼續講述下 Rootkit技術 的相關基礎知識點內容!
在《 滲透測試之內核安全系列課程:Rootkit技術初探 》之前的文章中,我們講述了 GDT 全局描述符表、LDT 局部描述符表、GDTR 全局描述符表 寄存器、LDTR 局部描述符表 寄存器 、一致性代碼、非一致性代碼、實模式、保護模式、線性地址 等非常重要的基礎知識點內容!
這些內容,是學習 Rootkit 技術 的基礎?!
今天,我們來重點講解下 線性地址 到 物理地址 的 轉換 !
注意,本章中的 比特位排序,是從 數字 1 開始計算的,第N位 對應的 比特位索引 為 第N位 - 1 。
注意,本章中的 字節排序,是從 數字 1 開始計算的,第N個字節?對應的 字節索引 為 第N個字節 - 1?。
說起,線性地址 到 物理地址 的 轉換,我們不得不提起幾個非常重要的?控制寄存器?!
CR0 寄存器、CR1 寄存器、CR2 寄存器、CR3 寄存器 。?
其中,CR1 寄存器 ,并沒有被實際使用,所以 暫時 忽略 !?
這里,重點只講 CR0 控制寄存器 、CR2 頁故障線性地址寄存器、?CR3 頁目錄基址寄存器 !
CR0 控制寄存器,最重要的兩個比特位,分別是第1位和第32位,剛好是 CR0寄存器的內容值的“ 頭 ” 和 “ 尾 ”?!
CR0控制寄存器的第1位 PE ,控制著 保護模式 的開啟 與 關閉 !當 PE 位 是 1 時,保護模式 處于 開啟狀態 ,當 PE 位 是 0 時,保護模式 處于 關閉狀態,此時 計算機 運行于 實模式 !
CR0控制寄存器的第32位 PG ,控制著 內存分頁機制?的開啟 與 關閉 !當 PG 位 是 1 時,內存分頁機制?處于 開啟狀態 ,當 PG 位 是 0 時,內存分頁機制?處于 關閉狀態,此時 計算機 運行于 實模式 !
如果需要 啟用 內存分頁機制,那么 第 1?位 PE 位 和 第 32 位 PG 位 的值,均要為 1 !
在禁用 CPU 的 內存分頁機制 時,線性內存地址 等同于 物理內存地址!
現在,讓我們來科普一下 布爾值 和 布爾運算 存在 的 意義!
這主要是為了讓您更加深刻地理解,0 和 1 所代表的 布爾運算 意義 !
在我之前發布的一些文章中,我提到了 布爾值 的 運算 !
非真即假,非假即真!不是真的?那么就一定是假的!不是假的?那么就一定是真的!
布爾值,只會存在 兩個值,True 真,或者 False 假 !
在 計算機領域 的 二進制 世界 中,數字 1 ,通常代表 True 真 !
在 計算機領域 的 二進制 世界 中,數字 0 ,通常代表 False 假 !
在 計算機領域 的 二進制 世界 中,數字 1 ,通常代表 條件成立 !
在 計算機領域 的 二進制 世界 中,數字 0 ,通常代表 條件不成立 !
在 計算機領域 的 二進制 世界 中,數字 1 ,通常代表 開啟 !
在 計算機領域 的 二進制 世界 中,數字 0 ,通常代表 關閉 !
這些知識,都屬于 計算機領域 中 技術知識 學習方面 的 小技巧 !
CR2 頁故障線性地址寄存器,主要用于 在頁異常情況發生時,報告相應的出錯信息。
當發生頁異常時(例如,指定的內存頁,并不存在!這時,會觸發 缺頁中斷 )CPU 會把引起 缺頁中斷 的 線性地址?保存在?CR2 頁故障線性地址寄存器?之中!
操作系統中的頁異常處理程序(其實就是 缺頁中斷 所對應的? 中斷服務程序)可以通過檢查 CR2 頁故障線性地址寄存器 的 內容值 的方式,去篩查出 缺頁中斷 這個異常 是 由 虛擬地址空間(線性地址空間)中的哪一個頁面不存在而引起的(CR2 頁故障線性地址寄存器,主要用于定位錯誤,以及通過分頁交換文件去輔助載入內存分頁)!?
我們需要知道,針對 缺頁中斷 ,從 硬盤 中?載入?對應的 頁表資源 或 頁資源,是由?缺頁中斷?對應的? 中斷服務程序 去完成的 !CR2?頁故障線性地址寄存器,在?從 硬盤空間??向 內存空間?載入??指定頁表資源 或 指定頁資源 時,起到了非常重要的作用 !
CR3?頁目錄基址寄存器,主要用于 PDT 頁目錄表 或 PDPT 頁目錄指針表 的 物理尋址 !
CR3?頁目錄基址寄存器,存儲了?PDT 頁目錄表 或?PDPT 頁目錄指針表 的 物理內存地址 !
在啟用了 PAE 物理地址擴展的基礎上,CR3?頁目錄基址寄存器 的 高 27 位,被用于 進行?PDPT 頁目錄指針表 的 物理地址尋址 !
上面提到了 CR3 寄存器,它主要用于存儲 頁目錄 在 內存空間 中的 物理地址?!
我們需要知道,開啟分頁機制之前(例如,開啟啟動,在正式載入系統內核之前,此時,CPU 還工作于 實模式 之下 ),CPU 進行的 尋址操作 ,還是基于 物理內存地址 的 !只有在開啟了 保護模式( 通過將 CR0 寄存器 的 第 1 個 比特位?PE位 的內容值置為 1 來實現 )和 內存分頁機制 ( 通過將 CR0 寄存器 的 第 32 個 比特位 PG位 的內容值置為 1 來實現 )之后,CPU 進行的 尋址操作 ,才會基于 線性內存地址 去進行 !在 開啟 保護模式 和 內存分頁機制 時,務必要 將 CR3 寄存器 指向 頁目錄表 的?基址(頁目錄表在內存空間中的起始地址)(物理內存地址) !
我們必須清晰地認知,虛擬地址空間?是被 操作系統 虛擬出來的!虛擬地址空間,只是 操作系統 進行 內存管理 的 一種技術實現方式!虛擬地址空間 和 物理地址空間 之間?存在 映射關系,每一個進程,都擁有自己的虛擬地址空間!當進程切換,CR3 頁目錄基址 寄存器 中的內容值,也會發生變化!這意味著,CR3 頁目錄基址寄存器 將指向 新的物理內存地址!這代表著,虛擬地址空間,會隨著進程切換行為,同時被切換掉!進程切換,虛擬地址空間,也會同步切換!
為什么 CR3寄存器 承擔著 切換虛擬地址空間 的義務呢?
CR3寄存器,是頁目錄基址寄存器,它存儲了頁目錄空間在內存空間中的物理內存地址!
CR3寄存器,是頁目錄基址寄存器,它指向了 內存空間 中的 頁目錄空間 !
CR3 寄存器,指定了頁目錄表 或 頁目錄指針表?在內存空間中的物理地址!記住,是物理地址!是物理地址!是物理地址!重要的事情,要說三遍 !!!!
CR3 寄存器,就相當于 大樹的根系 ,它 存儲著 頁目錄 的 內存物理地址!
與 CR3 寄存器 相關的 匯編指令,使用的是 內存物理地址!
CR3 寄存器,就像 樹狀 數據結構 中的 根節點 !
在 CPU 的 分頁機制 中,存在著 頁目錄、頁表、頁 這樣的 技術設計概念 !
我們已經說過了,CR3 寄存器,存儲著 頁目錄 的 內存物理地址!
頁目錄、頁表、頁 這樣的 技術架構設計 ,共同實現了 內存分頁機制 的 樹狀 數據結構 !
頁目錄,相當于 大樹的主干 !
頁表,相當于 大樹主干 上的 分叉 !
頁,相當于 大樹主干 的 分叉上 生長的 葉子 !
透徹理解,樹狀 數據結構,是 理解 CPU 分頁機制 技術實現 方面 的 重要基礎!?
頁目錄中,存在很多的子項,每個子項 均 指向了 頁表 在 內存空間 中的 物理地址 !
頁表中,存在很多的子項,每個子項 均 指向了 頁?在 內存空間 中的 物理地址 !
CPU 在 技術上實現 的 內存分頁機制 ,除了 頁目錄、頁表、頁 這樣的 技術架構設計 之外,線性地址 這種技術概念的出現,也是 實現 CPU 內存分頁機制 的 重要基礎!
線性地址、頁目錄、頁表、頁 等 技術架構設計 ,共同實現了 CPU 內存分頁機制 !
線性地址、頁目錄、頁表、頁 等 技術架構設計 ,使 CPU 內存分頁機制 的 技術實現 成為了可能 !
線性地址,有 32 位 和 64 位 之分!
32位 的 線性地址?,用于 32位操作系統 下的 內存尋址 (最大尋址范圍:4GB)!
64位 的 線性地址?,用于 64位操作系統 下的 內存尋址 (最大尋址范圍:64GB)!
本篇文章中,重點還是在 32位 操作系統 環境下 進行相關內容講解!
在 32位 環境下,很多概念,都是向 4 對齊的 !
在 64位 環境下,很多概念,都是向 8 對齊的 !
無論是 32 位 的 操作系統環境,還是 64位 的 操作系統環境,都是以向 2 的整數倍 對齊的!
內存邊界,一定會是 2 的 整數倍 !
在上面的內容中,我們簡單的提到了 線性地址、頁目錄、頁表、頁 的 架構設計 !
現在,我們來重點講一下 線性地址、頁目錄、頁表、頁 的方面的 技術實現 !
在 80386 以上規格的處理器環境中,32位操作系統環境下,內存分頁 中的?頁大小?是 4KB !
在 80386 以上規格的處理器環境中,64位操作系統環境下,內存分頁 中的?頁大小?是 8KB !
在內存空間中,bit 比特位 是 最基礎的 內存空間存儲單元 !
基礎知識科普:8 BIT?(比特位)= 1B(byte 字節);1024 B?= 1 KB ;1024 KB = 1 MB?; 1024MB = 1 GB;1024GB = 1TB 。
在 32位環境下,以 Windows 系列 的 操作系統 舉例 !
線性地址 從 0 開始,到 2 GB 結束 的 范圍內的內存空間,是 用戶態進程 的 內存使用空間 !
線性地址 從 2G 開始,到 4 GB 結束 的 范圍內的內存空間,是 內核態進程 的 內存使用空間 !
在 Windows 系列 的 操作系統環境 中 ,地址內存分段模式,是 基于平坦模式 的 !?
在 Linux 系列 的 操作系統環境 中 ,地址內存分段模式,是 基于平坦模式 的 !?
在 平坦模式 下 ,操作系統 能夠 訪問 一個連續的、不分段的 地址空間 !所有的段(包括 代碼段、數據段、棧段 等)都 被映射到同一個內存地址空間中!所有的段的段基址 都是 0 ,在32位環境下,段限長為 4GB,在64位環境下,段限長為64GB 。
記住了嗎?Windows 和 Linux 的 內存分段模式,都是 基于平坦模式 的 !
32位 線性地址 的 第 23~32位,是 頁目錄表項 中的 子項偏移量 !
32位 線性地址 的 第 23~32位 的 內容值 ,加上 CR3寄存器 中的 頁目錄基地址(頁目錄在內存空間中的起始物理地址),即得到了 頁目錄表項 的 物理內存地址 !
32位 線性地址 的 第 13~22位 的 內容值 ,加上 頁目錄表項 中 存儲的 子項偏移量,即得到了?內存分頁 的 物理內存地址 !
32位 線性地址 的 第 1~12位 的 內容值 ,加上 內存分頁?的 頁基址(內存頁的起始物理地址),即得到了 線性內存地址 對應的?物理內存地址 !
虛擬地址空間 ( 采用 線性地址 方式 進行 虛擬內存尋址 )與 物理地址空間 ( 采用 物理地址 方式 進行 物理內存尋址)之間,存在映射關系!一個進程,就會擁有一個虛擬地址空間!但是!物理地址空間,只會存在一個!這是 N 對 1 的 映射關系 !多個虛擬地址空間,通過進程切換(進程切換時,虛擬地址空間也會隨之被切換!切換原理 :更改 CR3 寄存器 的 內容值!CR3 寄存器 存儲了 指向 頁目錄表 的 物理地址 !物理地址被替換了,意味著 CR3寄存器 已經 指向了 不同的頁目錄表 !每個進程,都會擁有一個屬于自己的頁目錄表!頁目錄表,是屬于虛擬地址空間的!而每個進程,都會擁有一個虛擬地址空間!相應的,每個進程,都會存在一個頁目錄表),共享 同一個 物理地址空間 !
虛擬地址空間,是按 頁 進行管理的!
物理地址空間,也是按 頁 進行管理的!
虛擬地址空間 中的 頁面大小 和 物理地址空間 中的 頁面大小 相同!
在 Intel? 系列的 芯片中,存在專門的電路,負責將虛擬地址(線性地址)轉譯為內存物理地址!
還記得?內存管理單元 (MMU)嗎 (下面的內容,會有相應的介紹)?
虛擬地址空間,通過 樹狀 數據結構? 對 虛擬地址空間 進行 創建 和 管理 !
在 虛擬地址空間 中,線性內存空間 是 連續的 !通過 樹狀 數據結構,的確可以實現 對于任意線性地址空間的操作訪問 !
首先,根據?32位 線性地址 的 第 23~32位?的 內容值,結合?CR3寄存器 中的 頁目錄基地址?得到 頁目錄中對應子項(指定的頁表) 的 物理內存地址(指定頁表的內存空間基地址)!然后,根據?
32位 線性地址 的 第 13~22位 的 內容值,結合 已獲取的?指定頁表的內存空間基地址??得到 頁表中對應子項(指定的頁)?的?物理內存地址(指定頁的內存空間基地址)!最后,根據 32位?線性地址 的 第 1~12位 的 內容值,結合 已獲取的?指定頁的內存空間基地址??得到 線性地址 對應的 物理地址?!
在 虛擬地址空間 中,有些 虛擬頁面(內存頁面),并不存在對應的 物理頁面,我們管這種情況,叫做 “頁面缺失” !當這種情況發生時,會觸發 頁面缺失 中斷,由 頁面缺失 中斷?對應的?處理程序(這種處理程序,通常是一種 中斷服務例程 !不了解 中斷服務 的童鞋兒,可以去看一下 王爽 老師 寫的 《零基礎入門匯編語言》 這本書?),去將以虛擬內存形式存儲于硬盤中的頁面數據,從硬盤空間中取回!或許,這就是 虛擬內存 這個技術實現 的價值和存在意義!我們可以把這種行為,稱為 ” 數據交換 “?!
什么是 虛擬內存 ?
我們需要知道,在 Windows 系列 的 操作系統環境 中,?虛擬內存 在技術實現本質上?就是 物理內存 + 分頁文件 !
我們必須知道,分頁文件,是被存儲在 硬盤 上的 !
這里的?分頁文件,指的就是 分頁交換文件 !
在《Windows核心編程》一書的 第13個章節( 物理存儲器和頁交換文件 )內容中,重點講解了 分頁交換文件 和 物理存儲器 之間 進行?數據交換的過程 這種非常重要的基礎知識內容 !
在下一章內容中,我們將重點地去講解?分頁交換文件 和 物理存儲器 之間? 是 如何 進行?數據交換 的!下一章節中,我們將重點講解?分頁交換文件 和 物理存儲器 之間 的 數據交換 過程 !
在不同的操作系統環境中,對于 虛擬內存 的技術實現,會略有不同 !
在下一章內容中,我們會主要?參考 Windows 系列 的 操作系統 進行相應的 內容講解?!
還記得下面的這句話嗎?
在 Intel? 系列的 芯片中,存在專門的電路,負責將虛擬地址(線性地址)轉譯為內存物理地址!
是的!說到 線性地址 的 尋址,我們不得不重點提一下,CPU 的?內存管理單元 (MMU)!
CPU 的內存管理單元 (MMU)是什么東西呢 ?
內存管理單元 (MMU),的英文翻譯為 “ Memory Management Unit ” !
內存管理單元 (MMU),也被稱為 ” 分頁內存管理單元 “,英文翻譯為 ” paged memory management unit “,被簡寫為 ” PMMU “ !
內存管理單元 (MMU),是一種被用于處理?中央處理器( CPU )的 內存訪問請求 的 計算機硬件?!
內存管理單元 (MMU)的功能,包括?虛擬地址(線性地址)到 物理地址(內存物理地址)的轉換( 也就是,我們常說的,虛擬內存管理,或稱為 虛擬地址空間 管理 !這里,涉及到了 虛擬地址空間 的相關概念?)!
內存管理單元 (MMU)的功能,包括?內存保護(?內存分頁?的?執行保護,這里涉及到了?內存分頁?的?訪問權限?)!
內存管理單元 (MMU)的功能,包括?中央處理器高速緩存的控制( 這里主要指,對 CPU 中的 高速緩存部件 進行管控?)!
內存管理單元 (MMU)的功能,包括?在相對簡單的計算機體系結構中,負責進行總線的仲裁(總線仲裁(bus arbitration),計算機?中多個 設備?或?模塊?可能會同時去?申請?對于?總線?的?使用權?,為?避免?產生總線?沖突?,需由?總線仲裁機構?,也就是?內存管理單元 MMU 去進行 合理控制 和?適當管理 那些?需要占用總線的申請者(計算機中的 設備 或? 模塊 等),當多個申請者同時提出總線使用請求時,需要以一定的優先算法去決策哪個申請者能夠優先獲得對于總線的使用權)!
內存管理單元 (MMU)的功能,包括?負責進行存儲體切換(?bank switching,在非常簡單的計算機體系結構(例如,只有 8位 的 計算機設備)中 去執行 存儲體切換 操作 !目前這塊,筆者本人,也需要更加深入的理解,也許以后,會涉及到對這方面的更詳細講解?)。
大家一定要記住,內存管理單元 (MMU)這個硬件,是位于 中央處理器(CPU)之中的 !
CPU 的?內存管理單元 (MMU)的用途和價值,是什么呢 ?
?CPU 可以直接通過 MMU,去找出 實際要訪問 的 指定內存空間 的 物理內存地址 !
在保護模式下,MMU 內存管理單元 實現 的是 虛擬地址(線性地址)到 物理內存地址 的 轉換過程?!
大家需要記住,虛擬地址(線性地址)到 物理內存地址?的 轉換,是由?MMU 內存管理單元 去自動完成的!
(未完待續)
請關注下一篇,滲透測試之內核安全系列課程:Rootkit技術初探(四)