<menu id="guoca"></menu>
<nav id="guoca"></nav><xmp id="guoca">
  • <xmp id="guoca">
  • <nav id="guoca"><code id="guoca"></code></nav>
  • <nav id="guoca"><code id="guoca"></code></nav>

    【技術分享】剖析臟牛1_mmap如何映射內存到文件

    VSole2022-08-03 08:20:30

    測試程序

    int fd;struct stat st;void *mem;void processMem(void){    char ch = *((char*)mem);    printf("%c\n", ch);
    }int main(void){
        fd = open("./test", O_RDONLY);
        fstat(fd, &st);
        mem = mmap(NULL, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
    
        processMem();
    }
    

    進入MMAP

    • exp調用mmap
    • 最終變成syscall(9)

    sys_mmap()

    • 進入entry_SYSCALL_64切換內核保存用戶棧, 然后通過sys_call_table調用到sys_mmap()函數

    • 進行一些簡單檢查后進入sys_mmap_pgoff()

    sys_mmap_pgoff()

    • 就干了兩件事: 根據fd找到文件對象, 然后調用vm_mmap_pgoff

    vm_mmap_pgoff()

    • vm_mmap_pgoff()
    • 獲得mmap_sem這個信號量
    • 調用do_mmap_pgoff()
    • 如果需要的話調用mm_populate()

    do_mmap_pgoff()

    • 這是個do_mmap()的包裝函數

    do_mmap()

    • 進行一些準備工作:
    • 首先獲取當前進程的內存描述符
    • 然后處理一下基地址和內存權限
    • 再調用get_unmapped_area()從當前進程的虛擬地址空間中找到一片空閑區域
    • 這里找到的空閑地址是0x00007ffff7ffa000
    • 接著處理標志, 并進行一些簡單的檢查
    • 如果要映射到文件, 那么根據映射類型進行一些文件相關的檢查
    • file->f_op對于文件對象的方法集合, 這里其mmap方法對應shmem_mmap函數
    • 接著調用mmap_region()進行真正的映射工作, 并處理populate標志

    mmap_region()

    • mmap_region()首先進行三個小檢查:
    • 這個進程的虛擬地址空間還夠不夠映射
    • 如果這片區域已經有映射了, 那么就取消掉
    • 如果是私有可寫入映射, 檢查下內存還夠不夠進行寫時映射
    • 接著會申請一個VMA對象用于描述映射的虛擬內存區域
    • 可以直接擴展一個已有的VMA, 比如權限相同地址相鄰, 那么就不用分配一個新的VMA對象了
    • 否則從內核中分配一個00初始化的VMA對象并初始化
    • 接著對新的VMA對象進行一些文件相關初始化操作, 最重要的是兩步
    • 獲取一個文件對象, 增加引用計數: get_file()
    • 調用文件對象的f_op->mmap()方法設置VMA
    • 對于./test文件, 會調用shmem_file_operations.mmap, 也就是shmem_mmap()函數, 這個函數做兩件事:
    • touch一下文件, 表示訪問過
    • 設置這片虛擬內存的標準操作為shmem_vm_ops
    • vma->vm_ops是這片VMA上的各種操作集合, 對應struct vm_operations_struct結構體
    • shmem_vm_ops則是文件對象實現的, 當VMA發生某些事件時需要調用的函數
    • 其中最重要的就是缺頁異常處理函數shmem_fault()
    • 缺頁異常會在后面說到, 限制只要知道如果訪問這片新建的VMA發生缺頁異常, 就會調用vma->vm_ops->fault(), 也就是調用shmem_fault()函數

    • 然后把新建的VMA對象插入到mm內部從而完成VMA的創建工作
    • 最后進入out部分, 進行一些收尾工作并設置這片虛擬內存中每一頁的屬性(vm_page_prot)后結束映射

    退出系統調用

    • 首先所有函數棧一路回退到entry_SYSCALL_64, 這部分就是正常的C回退, 只是在內核地址空間發生而已
    • 回退到entry_SYSCALL_64后, 先把SyS_mmap()的返回值寫入到內核棧上保存的pt_regs->rax中
    • pt_regs用來保存陷入內核時的CPU狀態, 離開內核態時就用pt_regs恢復用戶態的執行環境, 從而繼續執行
    • 把pt_regs->rax設置為返回值, 就可以在恢復用戶的執行環境時設置rax寄存器為返回值, 從而符合C的函數調用約定
    • 由于退出系統調用的指令sysret會使用%rcx設置%rip, %r11設置EFLAGS, 因此要用內核棧中pt_regs->RIP設置%rcx, pt_regs->EFLAGS設置%r11
    • 然后用pt_regs恢復其余通用寄存器
    • 然后用pt_regs->rsp設置%rsp, 從而恢復用戶態的棧
    • 最后swapgs指令從MSR寄存器中換出用戶態的gs, 并保存內核態的gs, 最后調用sysret恢復到用戶態的執行

    為什么沒有讀文件?

    到這里我們會發現一個問題, mmap只是根據參數在進程的mm中插入了一個VMA對象, 并沒有真正的把文件中的信息讀入, 這是為什么?

    這其實是請求調頁與寫時復制的結果, 雖然映射到了文件,但不代表全部都會用到, 當你真正讀寫剛剛映射的內存區域時, MMU會發出一個缺頁異常給CPU, CPU調用內核的缺頁異常處理函數, 這時候再真正的分配物理內存或者把文件的內容讀到物理內存中, 實現按需分配

    后續留到下一個文章中細說

    mmap內存映射
    本作品采用《CC 協議》,轉載必須注明作者和本文鏈接
    musl libc 是一個專門為嵌入式系統開發的輕量級 libc 庫,以簡單、輕量和高效率為特色。
    前言本文主要著眼于glibc下的一些漏洞及利用技巧和IO調用鏈,由淺入深,分為 “基礎堆利用漏洞及基本IO攻擊” 與 “高版本glibc下的利用” 兩部分來進行講解,前者主要包括了一些glibc相關的基礎知識,以及低版本glibc下常見的漏洞利用方式,后者主要涉及到一些較新的glibc下的IO調用鏈。
    不可中斷狀態實際上是系統對進程和硬件設備的一種保護機制。當負載存在明顯升高趨勢時,及時進行分析和調查。系統調用過程中并不會涉及虛擬內存等進程用戶態資源,也不會切換進程。因此系統調用通常稱為特權模式切換。進程是由內核管理和調度的,進程上下文切換只能發生在內核態。因此相比系統調用來說,在保存當前進程的內核狀態和CPU寄存器之前,需要先把該進程的虛擬內存,棧保存下來。
    文中使用的示例代碼可以從 這里 獲取。的功能是在終端打印出hello這6個字符(包括結尾的?編譯它們分別生成libtest.so和?存在嚴重的內存泄露問題,每調用一次say_hello函數,就會泄露1024字節的內存
    QEMU逃逸系列
    2022-12-01 09:19:27
    qemu用于模擬設備運行,而qemu逃逸漏洞多發于模擬pci設備中,漏洞形成一般是修改qemu-system代碼,所以漏洞存在于qemu-system文件內。而逃逸就是指利用漏洞從qemu-system模擬的這個小系統逃到主機內,從而在linux主機內達到命令執行的目的。
    Android平臺注入技術
    2021-11-18 06:48:03
    也就是說在android系統中普通應用APP進程的父親都是zygote進程。zygote注入目的就是將指定的so模塊注入到指定的APP進程中,這個注入過程不是直接向指定進程進程注入so模塊,而是先將so模塊注入到zygote進程。
    android平臺注入技術
    2021-11-13 16:27:15
    在android系統中,進程之間是相互隔離的,兩個進程之間是沒辦法直接跨進程訪問其他進程的空間信息的。那么在android平臺中要對某個app進程進行內存操作,并獲取目標進程的地址空間內信息或者修改目標進程的地址空間內的私有信息,就需要涉及到注入技術。
    00 前言在 HWS2021 入營選拔比賽的時候,遇到了一道 QEMU 逃逸的題目,那個時候就直接莽上去分析了一通,東拼西湊的把 EXP 寫了出來。但是 QEMU 逃逸這部分的內容實在是比較復雜,而且涉及到了很多我完全沒有了解過的知識,所以一直鴿到了現在。System mode:系統模式,在這種模式下,QEMU 可以模擬出一個完整的計算機系統。
    VSole
    網絡安全專家
      亚洲 欧美 自拍 唯美 另类