ARM64的KASLR分析

基本概念

加載地址:內核解壓到物理內存上的物理起始地址

鏈接地址:內核編譯鏈接后的虛擬起始地址

我們的這篇 文章,介紹了加載地址可以是自動的,也可以是固定的;一般都是物理內存的起始地址 + 一個偏移 ;這個是編譯時就決定了鏈接地址跟加載地址的映射

我們的這篇 文章,介紹了kimage_voffset,就是運行時的內核的虛擬地址跟物理地址映射的真實偏移,不管經過與否kaslr

KASLR, kernel address space layout randomization,內核地址空間布局隨機化。KASLR技術可以讓kernel image的編譯鏈接時確定的加載地址,在真正解壓加載到物理內存時產生一個偏移,然后給這個新的加載地址映射一個新的虛擬地址

流程

stext作為鏡像的開始的地方

#define KERNEL_START    _text
#define __PHYS_OFFSET   (KERNEL_START - TEXT_OFFSET)
ENTRY(stext)bl      preserve_boot_argsbl      el2_setup                       // Drop to EL1, w0=cpu_boot_modeadrp    x23, __PHYS_OFFSETand     x23, x23, MIN_KIMG_ALIGN - 1    // KASLR offset, defaults to 0bl      set_cpu_boot_mode_flagbl      __create_page_tables/** The following calls CPU setup code, see arch/arm64/mm/proc.S for* details.* On return, the CPU will be ready for the MMU to be turned on and* the TCR will have been set.*/bl      __cpu_setup                     // initialise processorb       __primary_switch
ENDPROC(stext)

__create_page_tables

因為不知道有沒kaslr,先通過__create_page_tables創建加載地址跟鏈接地址的映射

__create_page_tables:mov     x28, lr/** Invalidate the init page tables to avoid potential dirty cache lines* being evicted. Other page tables are allocated in rodata as part of* the kernel image, and thus are clean to the PoC per the boot* protocol.*/adrp    x0, init_pg_diradrp    x1, init_pg_endsub     x1, x1, x0bl      __inval_dcache_area/** Clear the init page tables.*/adrp    x0, init_pg_diradrp    x1, init_pg_endsub     x1, x1, x0
1:      stp     xzr, xzr, [x0], #16stp     xzr, xzr, [x0], #16stp     xzr, xzr, [x0], #16stp     xzr, xzr, [x0], #16subs    x1, x1, #64b.ne    1bmov     x7, SWAPPER_MM_MMUFLAGS/** Create the identity mapping.*/adrp    x0, idmap_pg_diradrp    x3, __idmap_text_start          // __pa(__idmap_text_start)#ifdef CONFIG_ARM64_VA_BITS_52mrs_s   x6, SYS_ID_AA64MMFR2_EL1and     x6, x6, #(0xf << ID_AA64MMFR2_LVA_SHIFT)mov     x5, #52cbnz    x6, 1f
#endifmov     x5, #VA_BITS_MIN
1:adr_l   x6, vabits_actualstr     x5, [x6]dmb     sydc      ivac, x6                // Invalidate potentially stale cache line/** VA_BITS may be too small to allow for an ID mapping to be created* that covers system RAM if that is located sufficiently high in the* physical address space. So for the ID map, use an extended virtual* range in that case, and configure an additional translation level* if needed.** Calculate the maximum allowed value for TCR_EL1.T0SZ so that the* entire ID map region can be mapped. As T0SZ == (64 - #bits used),* this number conveniently equals the number of leading zeroes in* the physical address of __idmap_text_end.*/adrp    x5, __idmap_text_endclz     x5, x5cmp     x5, TCR_T0SZ(VA_BITS_MIN) // default T0SZ small enough?b.ge    1f                      // .. then skip VA range extensionadr_l   x6, idmap_t0szstr     x5, [x6]dmb     sydc      ivac, x6                // Invalidate potentially stale cache line#if (VA_BITS < 48)
#define EXTRA_SHIFT     (PGDIR_SHIFT + PAGE_SHIFT - 3)
#define EXTRA_PTRS      (1 << (PHYS_MASK_SHIFT - EXTRA_SHIFT))/** If VA_BITS < 48, we have to configure an additional table level.* First, we have to verify our assumption that the current value of* VA_BITS was chosen such that all translation levels are fully* utilised, and that lowering T0SZ will always result in an additional* translation level to be configured.*/
#if VA_BITS != EXTRA_SHIFT
#error "Mismatch between VA_BITS and page size/number of translation levels"
#endifmov     x4, EXTRA_PTRScreate_table_entry x0, x3, EXTRA_SHIFT, x4, x5, x6
#else/** If VA_BITS == 48, we don't have to configure an additional* translation level, but the top-level table has more entries.*/mov     x4, #1 << (PHYS_MASK_SHIFT - PGDIR_SHIFT)str_l   x4, idmap_ptrs_per_pgd, x5
#endif
1:ldr_l   x4, idmap_ptrs_per_pgdmov     x5, x3                          // __pa(__idmap_text_start)adr_l   x6, __idmap_text_end            // __pa(__idmap_text_end)map_memory x0, x1, x3, x6, x7, x3, x4, x10, x11, x12, x13, x14/** Map the kernel image (starting with PHYS_OFFSET).*/adrp    x0, init_pg_dirmov_q   x5, KIMAGE_VADDR + TEXT_OFFSET  // compile time __va(_text)add     x5, x5, x23                     // add KASLR displacementmov     x4, PTRS_PER_PGDadrp    x6, _end                        // runtime __pa(_end)adrp    x3, _text                       // runtime __pa(_text)sub     x6, x6, x3                      // _end - _textadd     x6, x6, x5                      // runtime __va(_end)map_memory x0, x1, x5, x6, x7, x3, x4, x10, x11, x12, x13, x14/** Since the page tables have been populated with non-cacheable* accesses (MMU disabled), invalidate those tables again to* remove any speculatively loaded cache lines.*/dmb     syadrp    x0, idmap_pg_diradrp    x1, idmap_pg_endsub     x1, x1, x0bl      __inval_dcache_areaadrp    x0, init_pg_diradrp    x1, init_pg_endsub     x1, x1, x0bl      __inval_dcache_arearet     x28
ENDPROC(__create_page_tables)

__primary_switch

1.如果開啟了CONFIG_RANDOMIZE_BASE(kaslr),先通過第一次的__primary_switched里面的kaslr_early_init,解析出KASLR offset并存儲到X23寄存器

2.然后通過__create_page_tables重新映射內核鏡像,也就是給物理地址分配虛擬地址

3.分配完的地址跟編譯時的鏈接地址不一樣了,所以需要重定位內核鏡像---對符號地址進行重定位,校正內核代碼的符號尋址,以此確保內核代碼的正常執行

4.再執行一次__primary_switched去更新kimage_voffset

__primary_switch:
#ifdef CONFIG_RANDOMIZE_BASEmov     x19, x0                         // preserve new SCTLR_EL1 valuemrs     x20, sctlr_el1                  // preserve old SCTLR_EL1 value
#endifadrp    x1, init_pg_dirbl      __enable_mmu
#ifdef CONFIG_RELOCATABLE
#ifdef CONFIG_RELRmov     x24, #0                         // no RELR displacement yet
#endifbl      __relocate_kernel
#ifdef CONFIG_RANDOMIZE_BASEldr     x8, =__primary_switchedadrp    x0, __PHYS_OFFSETblr     x8/** If we return here, we have a KASLR displacement in x23 which we need* to take into account by discarding the current kernel mapping and* creating a new one.*/pre_disable_mmu_workaroundmsr     sctlr_el1, x20                  // disable the MMUisbbl      __create_page_tables            // recreate kernel mappingtlbi    vmalle1                         // Remove any stale TLB entriesdsb     nshisbmsr     sctlr_el1, x19                  // re-enable the MMUisbic      iallu                           // flush instructions fetcheddsb     nsh                             // via old mappingisbbl      __relocate_kernel
#endif
#endifldr     x8, =__primary_switchedadrp    x0, __PHYS_OFFSETbr      x8
ENDPROC(__primary_switch)

__primary_switched

上述操作執行完_text變了,kimage_vaddr(_text - TEXT_OFFSET)也就跟著變了,kimage_voffset也就成了虛擬地址轉物理地址函數的實際偏移了,就可以通過start_kernel進內核的C語言部分了

__primary_switched:adrp    x4, init_thread_unionadd     sp, x4, #THREAD_SIZEadr_l   x5, init_taskmsr     sp_el0, x5                      // Save thread_infoadr_l   x8, vectors                     // load VBAR_EL1 with virtualmsr     vbar_el1, x8                    // vector table addressisbstp     xzr, x30, [sp, #-16]!mov     x29, sp#ifdef CONFIG_SHADOW_CALL_STACKadr_l   x18, init_shadow_call_stack     // Set shadow call stack
#endifstr_l   x21, __fdt_pointer, x5          // Save FDT pointerldr_l   x4, kimage_vaddr                // Save the offset betweensub     x4, x4, x0                      // the kernel virtual andstr_l   x4, kimage_voffset, x5          // physical mappings// Clear BSSadr_l   x0, __bss_startmov     x1, xzradr_l   x2, __bss_stopsub     x2, x2, x0bl      __pi_memsetdsb     ishst                           // Make zero page visible to PTW#ifdef CONFIG_KASANbl      kasan_early_init
#endif
#ifdef CONFIG_RANDOMIZE_BASEtst     x23, ~(MIN_KIMG_ALIGN - 1)      // already running randomized?b.ne    0fmov     x0, x21                         // pass FDT address in x0bl      kaslr_early_init                // parse FDT for KASLR optionscbz     x0, 0f                          // KASLR disabled? just proceedorr     x23, x23, x0                    // record KASLR offsetldp     x29, x30, [sp], #16             // we must enable KASLR, returnret                                     // to __primary_switch()
0:
#endifadd     sp, sp, #16mov     x29, #0mov     x30, #0b       start_kernel
ENDPROC(__primary_switched)/** end early head section, begin head code that is also used for* hotplug and needs to have the same protections as the text region*/.section ".idmap.text","awx"ENTRY(kimage_vaddr).quad           _text - TEXT_OFFSET
EXPORT_SYMBOL(kimage_vaddr)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/17841.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/17841.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/17841.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

pillow學習3

Pillow庫中&#xff0c;圖像的模式代表了圖像的顏色空間。以下是一些常見的圖像模式及其含義&#xff1a; L&#xff08;灰度圖&#xff09;&#xff1a;L模式表示圖像是灰度圖像&#xff0c;每個像素用8位表示&#xff08;范圍為0-255&#xff09;&#xff0c;0表示黑色&#…

在flutter initState 方法,觸發 setState導致循環執行

在Flutter中&#xff0c;如果你在initState中調用了一個方法&#xff0c;并且這個方法可能導致狀態更新&#xff0c;這可能會引起無限循環&#xff0c;因為每次狀態更新都會再次調用initState。 為了避免這種情況&#xff0c;你應該檢查調用的方法是否會導致狀態更新&#xff…

圖算法新書發布會圓滿成功,大咖現場都講了啥?

5月24日&#xff0c;嬴圖與機工社攜手舉辦的“《圖算法&#xff1a;行業應用與實踐》新書發布會”圓滿成功。 現場直播在線觀眾達4000人/次左右&#xff0c;點贊數量超7000&#xff0c;直至發布會尾聲&#xff0c;觀看人數仍在持續增長。 通過觀眾們的反饋&#xff0c;我們也對…

Matplotlib 實踐指南:圖形樣式、風格與標記探索

目錄 前言 第一點&#xff1a;導入模塊 第二點&#xff1a;創建二維圖 第三點&#xff1a;創建統計圖 總結 前言 Matplotlib 是一個強大的數據可視化庫&#xff0c;可用于創建各種類型的圖形。在本文中&#xff0c;我們將研究如何在 Matplotlib 中設置圖形的顏色、風格和標記…

【LeetCode算法】第88題:合并兩個有序數組

目錄 一、題目描述 二、初次解答 三、官方解法 四、總結 一、題目描述 二、初次解答 1. 思路&#xff1a;首次想到的解法&#xff1a;定義一個mn長度的輔助數組&#xff0c;從頭遍歷這兩個數組&#xff0c;誰小就放進輔助數組中并且對應往后走&#xff0c;最后使用memcpy函…

巧用java8的stream流的.collect(Collectors.toMap(arg1,arg2))

最近公司接手了一個低代碼二次開發平臺的需求&#xff0c;需要連接多張表的數據然后展示到界面上。 按照java的sql思路&#xff0c;我們直接通過left join去關聯表就行了&#xff0c;但是該低代碼平臺有對sql連表查詢有限制&#xff0c;就是有些表它是存在一個domainKey的&…

HotSpot虛擬機的幾個實現細節

文章目錄 STW安全點安全區域記憶集與卡表讀寫屏障 STW 收集器在根節點枚舉這步都是必須要暫停用戶線程的&#xff08; STW &#xff09;&#xff0c;如果不這樣的話在根節點枚舉的過程中由于引用關系在不斷變化&#xff0c;分析的結果就不準確 安全點 收集器在工作的時候某些…

切勿安裝這五款流氓軟件,你中招了沒

流氓軟件&#xff0c;又稱為惡意軟件&#xff0c;是一類設計用來損害用戶設備、竊取信息或干擾正常使用的程序。以下是五款臭名昭著的流氓軟件介紹&#xff0c;提醒切勿安裝&#xff0c;只能說一個比一個毒&#xff0c;你中招了沒 可以去去虛擬機試試誰的毒更強一些&#xff0…

高工咨詢:《2024中國人形機器人產業發展藍皮書》

高工咨詢所發布的《2024中國人形機器人產業發展藍皮書》全面梳理了人形機器人產業的發展現狀、政策環境、資本市場、技術發展、市場前景以及面臨的機遇與挑戰等情況。 人形機器人是當今世界科技領域最具潛力和前景的產業之一。隨著科技的不斷進步和人 工智能技術的快速發展&…

基于jeecgboot-vue3的Flowable增加表單功能(二)

因為這個項目license問題無法開源&#xff0c;更多技術支持與服務請加入我的知識星球。 接上一節 6、增加一個types.ts 類型 export interface FormForm {id: number | string | undefined;formName: string;formContent?: string;remark: string; } 7、api增加一個getForm…

Github Page 部署失敗

添加 .gitmodules 文件 [submodule "themes/ayer"]path themes/ayerurl https://github.com/Shen-Yu/hexo-theme-ayer.git 添加 .nojekyll 文件

React Fiber

React引入Fiber前后的區別&#xff1a; 渲染流程的控制&#xff1a; 之前&#xff1a;在Fiber之前&#xff0c;React的渲染過程是一個相對線性的深度優先遍歷過程&#xff0c;從根節點開始遍歷整個組件樹&#xff0c;這個過程一旦開始就無法中斷&#xff0c;直到完成。如果遇到…

滾珠花鍵在工業自動化領域中有什么優勢?

滾珠花鍵是工業自動化設備中重要的傳動系統之一&#xff0c;不僅在工業自動化系統中有著廣泛的運用&#xff0c;還在機械制造領域、航空航天領域、工業汽車領域、工業機器人、高速鐵路、新能源領域 等都得到廣泛應用。由于具有高精度、高承載、耐磨損、傳遞扭矩大等特點&#x…

android 關于自定義View在特殊情況下觸發setPressed方法(View源碼解析)

文章目錄 前言一、為什么樣式會變&#xff1f;二、調試發現原因并解決1.找到原因2.解決 總結 前言 最近在負責一些UI相關的工作,測試給到一個UI的bug,說是搜索框在點擊的時候,旁邊的’‘X’變成按壓的效果了,我轉手就把bug轉給負責公控的同事了,因為這個搜索框是公控同事提供的…

Mysql常用操作DDL數據庫、表操作:

SQl DDl-數據庫操作 查詢 查詢所有數據庫 show databases; 查詢當前數據庫 select database(); 創建 create database [if not exists] 數據庫名 [default charset 字符集] [collate 排序規則]; 刪除 drop database[if exists] 數據庫名; 使用 use 數據庫名;…

K8s集群中的Pod調度約束親和性與反親和性

前言 在 K8s 集群管理中&#xff0c;Pod 的調度約束——親和性&#xff08;Affinity&#xff09;與反親和性&#xff08;Anti-Affinity&#xff09;這兩種機制允許管理員精細控制 Pod 在集群內的分布方式&#xff0c;以適應多樣化的業務需求和運維策略。本篇將介紹 K8s 集群中…

運維開發詳解:現代IT環境的核心角色

隨著信息技術的快速發展和互聯網應用的廣泛普及&#xff0c;運維開發&#xff08;DevOps&#xff09;在現代IT環境中扮演著越來越重要的角色。本文將詳細探討運維開發的概念、歷史背景、關鍵實踐、工具和未來趨勢&#xff0c;旨在為讀者提供全面的理解。 什么是運維開發&#…

labview類編程

1.父類的功能是通用功能&#xff0c;所有子類都含有父類的功能&#xff0c;重寫會自動執行一次父類的功能。 2.每個子類都用了父類的注冊vi&#xff0c;所以在調用的時候&#xff0c;出來的就是子類注冊的vi&#xff0c;也就是window.vi。 3.假如要設計一個父類的vi,首先是保存…

手持高速暴力風扇方案32位單片機

RAMSUN一款低成本的暴力無刷風扇方案&#xff0c;集成無刷電機驅動、電池低壓保護等功能的同時&#xff0c;保持較低的待機功耗。 手持高速暴力風扇主控芯片MM32SPIN080C高性能的單電機控制 SOC 產品,集成了運動控制所需的專用模擬外設。包括 12 位高精度 ADC、2 路模擬比較器…

Mac 系統 clion 使用 getline 無法讀取文件內容

不知道是 mac 的問題還是 clion 的問題&#xff0c;如下面代碼 #include <iostream> #include <fstream>using namespace std;int main() {string file_name "1.txt";std::ifstream file(file_name);if (file.is_open()) {std::string line;while (std…