LINUX.ORG.RU

mprotect возвращает -1 в Solus Linux

 ,


0

1

Собственно проблема описана в заголовке.

Пример кода который я пытаюсь исполнить:

#include <sys/mman.h>
#include <stdio.h>
#include <stdlib.h>

int main() {
    char* code = malloc(4);
    int i = 0;
    code[i++] = 0x48;
    code[i++] = 0x89;
    code[i++] = 0xf8;
    code[i++] = 0xc3;

    printf("%i\n", mprotect(code,4,PROT_EXEC)); // напечатает -1
   
    
}

Грешил на то что виноват SELinux, но его в системе не было, что можно предпринять чтобы заставить mprotect,mmap и прочее работать?

Ответ на: комментарий от vertexua

Код дальше printf не хочет работать: ``` printf(«%i\n»,mprotect(code,4,PROT_EXEC)); perror(errno);

-1 Ошибка сегментирования ```

red_widowmaker
() автор топика
Ответ на: комментарий от vertexua

Если убрать printf:

mprotect(code,4,PROT_EXEC);
    printf("%i",errno);

errno будет равен 22,причем perror приводит к сегментации

red_widowmaker
() автор топика

Прочитай ман, что ли. man malloc (раздел RETURN VALUE) тоже прочитай.

anonymous
()

mprotect() changes the access protections for the calling process's memory pages containing any part of the address range in the interval [addr, addr+len-1]. addr must be aligned to a page boundary.

addr must be aligned to a page boundary.

to a page boundary

Про страницы памяти сам разберёшься?

Зы, макском, убери гуглокапчу, сцуко

anonymous
()
Ответ на: комментарий от anonymous

Да я пытался передавать такое в malloc: sysconf(_SG_PAGE_SIZE) * num_pages, но это никак не решило проблемы, видимо проблема в чем то еще ибо я протестировал тот же самый код в Rust и Zig и оно заработало

red_widowmaker
() автор топика
Ответ на: комментарий от red_widowmaker

Адрес в памяти (в виде целого числа), который передаешь в mprotect должен делиться на sysconf(_SG_PAGE_SIZE) без остатка.

Посему выдели malloc-ом немного больше и смести указатель так, чтоб выполнялось это условие.

nikitos ★★★
()

А почему ты решил, что через mprotect() можно менять выделенную через malloc() память? Да и вообще mprotect() можно не использовать, можешь сразу выделять через mmap() перезаписываемую и исполняемую память, если надо

SZT ★★★★★
()
Ответ на: комментарий от SZT

можешь сразу выделять через mmap() перезаписываемую и исполняемую память, если надо

Фу такие советы давать

anonymous
()
Ответ на: комментарий от anonymous

Я сам в основном конечно сначало пишу машинный код в память выделенную благодаря malloc, но затем вызываю mmap с PROT_READ | PROT_WRITE | PROT_EXEC дабы в последующем изменять этот код

red_widowmaker
() автор топика
Ответ на: комментарий от red_widowmaker

Тебе сколько раз сказали маны читать?

POSIX says that the behavior of mprotect() is unspecified if it is applied to a region of memory that was not obtained via mmap(2).

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.