mprotect 設定記憶體訪問許可權

2021-06-16 18:16:37 字數 1482 閱讀 5879

mmap 的第三個引數指定對記憶體區域的保護,由標記讀、寫、執行許可權的 prot_read、prot_write 和 prot_exec 按位與操作獲得,或者是限制沒有訪問許可權的 prot_none。如果程式嘗試在不允許這些許可權的本地記憶體上操作,它將被 sigsegv 訊號(segmentation fault,段錯誤)終止。

在記憶體對映完成後,這些許可權仍可以被 mprotect 系統呼叫所修改。mprotect 的引數分別為記憶體區間的位址,區間的大小,新的保護標誌設定。所指定的記憶體區間必須包含整個頁:區間位址必須和整個系統頁大小對齊,而區間長度必須是頁大 小的整數倍。這些頁的保護標記被這裡指定的新保護模式替換。

獲得頁面對齊的記憶體

應注意的是, malloc 返回的記憶體區域通常並不與記憶體頁面對齊,甚至在記憶體的大小是頁大小整數倍的情況下也一樣。如果您想保護從 malloc 獲得的記憶體,您不得不分配乙個更大的記憶體區域並在其中找到乙個與頁對齊的區間。

您可以選擇使用 mmap 系統呼叫來繞過 malloc 並直接從 linux 核心中分配頁面對齊記憶體。

mmap通過對映 /dev/zero 來分配記憶體頁。記憶體將被初始化為可讀和可寫模式。

int fd = open (「/dev/zero」, o_rdonly);

char* memory = mmap (null, page_size, prot_read | prot_write, map_private, fd, 0);

close (fd);

然後,您的程式可以使用 mprotect 把它變成唯讀:

mprotect (memory, page_size, prot_read);
有一種監控記憶體訪問的高階技巧,可以通過利用 mmap 和 mprotect 保護目標記憶體區間,然後當程式訪問時候接收並處理 linux 系統傳送的 sigsegv 訊號。** 展示了這個技巧。

**使用mprotect檢測記憶體訪問

#include #include #include #include #include #include #include #include static int alloc_size;

static char* memory;

void segv_handler (int signal_number)

int main ()

上述程式按照如下步驟執行:

程式為 sigsegv 建立乙個訊號處理控制代碼。

程式通過對映 /dev/zero 分配乙個記憶體分頁,然後通過寫入資料的方式獲得乙個私有複本。

程式通過呼叫帶 prot_none 許可權的 mprotect 保護了記憶體。

當程式在後續執行中寫入記憶體時,linux 向程序傳送 sigsegv,這個訊號被 segv_handler 控制代碼接收處理。這個控制代碼將解除記憶體保護,因而程式記憶體訪問得以繼續。

當訊號控制代碼執行完成時,程式控制權返回 main 函式,程式將使用 munmap 來釋放記憶體。

from:

使用mprotect定位踩記憶體故障

對於 c 語言來說,記憶體被踩是比較常見的問題,輕則普通變數被改寫程式邏輯出錯,重則指標變數被改寫引發指標解引用出現未定義行為風險 定位記憶體被踩一直是棘手的難題,如果出現程式跑死,一般可以通過堆疊資訊來定位 1 檢視跑死的呼叫鏈,確定跑死 的位置 2 根據pc指標找到具體 3 走查 分析問題 但是...

根據 scope 策略設定受保護api訪問許可權

1 新增 apiscope 2 新增 apiresource 新增api名為 client credentials apis 的apiresource,並把作用域 client credentials apis.identityusercontroller.scope 和 client creden...

public 等訪問權

一 訪問許可權 1 private 定義的屬性和方法只能在自己類中訪問 2 protected 受保護的訪問 在繼承中相當於public 在其他類中使用時private 3 default 預設的 不寫會自動新增 定義的屬性只能在同乙個包中訪問 即使是子包也不行 4 public 可以在不同的包中訪...