如何一次性保护跨越多个页面的存储区域?

时间:2019-05-15 04:06:46

标签: linux assembly x86 x86-64 nasm

我正在尝试取消保护跨越几页的一块内存区域。 我正在使用此代码来取消保护一页的内存,但是我需要一次取消保护几页,因为在访问其他页面时遇到段错误,我手头有一个起始地址和一个结束地址,但是下面的函数可以使用起始地址rdi并赋予我对当前页面的写访问权限,我如何利用结束地址r15来拥有跨越rdi -> r15内存页面的写访问权限:< / p>

例如:一次访问从rdi = 0x4012a0到r15 = 0x402340地址的页面上进行写访问

call getpagesize
; rax has 0x1000
mov rcx, rax
; save rax for later use when passing to mprotect
sub rcx, 0x1
not rcx
mov rdi, %1
and rdi, rcx
; AND them and the result will be stored in rcx
; rdi must hold the page_start address
mov rsi, rax
; rsi must have the page length
mov rdx, 0x7
; read+write+exec = 0x7
call mprotect

1 个答案:

答案 0 :(得分:4)

这不太正确:

; rsi must have the page length

在这里,rsimprotect()调用的第二个参数,它应该是您要更改的区域的长度。如果您希望区域的长度大于一页,则需要rsi大于从call getpagesize获得的值。

具体来说;也许您想要更多类似的东西:

    call getpagesize
    ; rax has 0x1000
    mov rcx, rax
    ; save rax for later use when passing to mprotect
    sub rcx, 0x1
    not rcx
    mov rdi, %1
    and rdi, rcx
    ; AND them and the result will be stored in rcx
    ; rdi must hold the page_start address

    mov rsi, r15      ;rsi = end
    sub rsi,rdi       ;rsi = end - aligned_start = length

    mov rdx, 0x7
    ; read+write+exec = 0x7
    call mprotect