Как снять защиту области памяти, занимающей несколько страниц за один раз? - PullRequest
2 голосов
/ 15 мая 2019

Я пытаюсь снять защиту с области памяти, занимающей несколько страниц.Я использую этот код для снятия защиты с одной страницы памяти, однако мне нужно снять защиту нескольких страниц за один раз, так как я испытываю segfault при доступе к другим страницам, у меня есть начальный адрес и конечный адрес под рукой, однако функция ниже используетмоего начального адреса rdi и дает мне доступ на запись к текущей странице, как я могу использовать конечный адрес r15, чтобы я мог иметь доступ на запись, охватывающий rdi -> r15 страниц памяти:

Дляпример: доступ для записи на страницы, охватывающие от 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 Ответ

4 голосов
/ 15 мая 2019

Это не совсем верно:

; 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
...