LINUX.ORG.RU

Аналог mprotect для MacOsX

 ,


0

3

Доброй ночи! Для Linux существует системный вызов mprotect, которым можно модифицировать права доступа практически для любой области адресного пространства данного процесса. Но если отойти от Linux, к примеру, в сторону Mac OS X, то вообще говоря, стандарт POSIX не даёт никаких гарантий по поводу того, как будет вести себя этот вызов при попытке модифицировать права доступа произвольной области памяти, а мне лично необходимы права на чтение и запись секции кода данного процесса. Хотелось бы знать, есть ли в Mac OS X (а в идеале - в POSIX) способ гарантированно получить доступ на чтение-запись-исполнение секции кода?


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

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

Дело в том, что мне нужно разрешить запись секции .text, которая явно не примапливается с помощью mmap(2). На Linux это делается спокойно, потому что

On Linux, it is always permissible to call mprotect() on any address in a process's address space (except for the kernel vsyscall area). In particular it can be used to change existing code mappings to be writable.

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

Какой-то явно левый mprotect в линуксе, ты бы явно написал, что тебе нужно отстрелить ногу?

А нафига тебе в .text что-то писать вообще? Аллоцируй уж новую облась mmap'ом и действуй.

anonymous
()
#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include <sys/mman.h>

int foo() {
        return 666;
}

int main() {
        mprotect((uintptr_t)foo / 4096 * 4096, 4096, PROT_READ | PROT_WRITE | PROT_EXEC);

        char code[] = {0x48, 0xC7, 0xC0, 0x2A, 0x00, 0x00, 0x00, 0xC3};
        memcpy(foo, code, sizeof(code));

        printf("%d\n", foo());
}
💢  ./test
42
💢  uname -a
Darwin master.lan 16.1.0 Darwin Kernel Version 16.1.0: Mon Oct  3 14:03:15 PDT 2016; root:xnu-3789.21.3~20/RELEASE_X86_64 x86_64
💢  sw_vers
ProductName:	Mac OS X
ProductVersion:	10.12.1
BuildVersion:	16B2548a
Deleted
()
Последнее исправление: romeo250501 (всего исправлений: 1)
Ответ на: комментарий от Deleted

Отлично, на Вашем компьютере с установленной Mac OS X исполняемый код редактировать можно. Это уже хорошо, но хотелось бы, каких-то железных гарантий, что он, например, будет работать на всех версиях Mac OS. Грубо говоря, хотелось бы где-то в мануалах по ядру Mach такую же цитату, но уже про ядро Mach.

On Linux, it is always permissible to call mprotect() on any address in a process's address space (except for the kernel vsyscall area). In particular it can be used to change existing code mappings to be writable.

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

хотелось бы, каких-то железных гарантий

Обратись в страховую компанию.

хотелось бы где-то в мануалах по ядру Mach такую же цитату, но уже про ядро Mach.

Посмотри, как работает загрузчик OS X. Он наверняка делает mmap исполняемого файла - других загрузчиков на Unix общего назначения уже не осталось.

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

А нафига тебе в .text что-то писать вообще?

Он хакир, очевидно же. Или даже крякир.

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

Можно выделять память через mmap и затем копировать туда код через memcpy. Главное точно знать размер кода.

Deleted
()
Последнее исправление: romeo250501 (всего исправлений: 1)
Ответ на: комментарий от Deleted

Все джампы слетят. Но я б так и делал. mprotect на неаллоцированую ранее область — это дыра, а ляликс, значит, решето

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

Пусть так. Если оно работает черз mmap исполняемого файла - это традиционный Unix-загрузчик.

tailgunner ★★★★★
()

ору с опа, такая-то детская незамутненность сознания и простота. изменение битов защиты страниц для text - адовая дыра в безопасности, осх начиная с 10.10 не разрешает это по дефолту (как и ptrace() для неподписанных специальным ключем приложений)

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