我正在尝试取消保护跨越几页的一块内存区域。
我正在使用此代码来取消保护一页的内存,但是我需要一次取消保护几页,因为在访问其他页面时遇到段错误,我手头有一个起始地址和一个结束地址,但是下面的函数可以使用起始地址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
答案 0 :(得分:4)
这不太正确:
; rsi must have the page length
在这里,rsi
是mprotect()
调用的第二个参数,它应该是您要更改的区域的长度。如果您希望区域的长度大于一页,则需要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