[LINUX] Ein Hinweis zu mprotect (2)

Überblick

Beachten Sie, dass ich den regulären mprotect aufgrund von Strace nicht wirklich verstanden habe

Was ist mprotect (2)?

mprotect (2) ist ein Systemaufruf, der die Speicherbereichsberechtigungen steuert.

man mprotect(2)

#include <sys/mman.h>

int mprotect(const void *addr, size_t len, int prot);

Übergeben Sie den Zeiger, die Größe und die logische Summe der Bits.

Flagge

Derzeit können Schutzbits kombiniert werden, indem das folgende ODER verwendet wird

Flaggenname Überblick
PROT_NONE Überhaupt kein Schutz
PROT_READ Seite ist lesbar
PROT_WRITE Seite ist beschreibbar
PROT_EXEC Seite ist ausführbar

Error

Bei Erfolg gibt mprotect () 0 zurück. Im Fehlerfall wird -1 zurückgegeben und errno entsprechend eingestellt.

errno Überblick
EACCES Der angegebene Zugriff auf den Speicher kann nicht festgelegt werden
EINVAL addr ist kein gültiger Zeiger oder ein Vielfaches der Systemseitengröße
ENOMEM Struktur im Kernel konnte nicht zugeordnet werden
ENOMEM [addr, addr+len-1]Die Adresse im Bereich ist ungültig, da der Adressraum des Prozesses oder die Adresse im Bereich auf eine oder mehrere Seiten verweist, die nicht zugeordnet sind.

Anwendungsbeispiel

Ein Beispielprogramm, das SIGSEGV generiert, indem es in den Speicher im Bereich READ_ONLY schreibt.

SIGSEGV selbst führt die mit Sigaction behandelte Verarbeitung aus.

mprotect.c


#include <unistd.h>
#include <signal.h>
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/mman.h>

#define handle_error(msg) \
    do { perror(msg); exit(EXIT_FAILURE); } while (0)

static char *buffer;

static void handler(int sig, siginfo_t *si, void *unused)
{
    printf("Got SIGSEGV at address: 0x%lx\n",
        (long) si->si_addr);
    exit(EXIT_FAILURE);
}

int main(int argc, char **argv)
{
    char *p;
    int pagesize;
    

    //Änderungen im Signalverhalten
    struct sigaction sa;
    sa.sa_flags = SA_SIGINFO;
    sigemptyset(&sa.sa_mask);
    sa.sa_sigaction = handler;
    if (sigaction(SIGSEGV, &sa, NULL) == -1)
        handle_error("sigaction");

    pagesize = sysconf(_SC_PAGE_SIZE);
    if (pagesize == -1)
        handle_error("sysconf");

    //Ordnen Sie den ausgerichteten Speicher zu
    buffer = memalign(pagesize, 4 * pagesize);
    if (buffer == NULL)
        handle_error("memalign");

    printf("Start of region:        0x%lx\n", (long) buffer);

    //Steuern Sie die Speicherbereichsberechtigungen
    if (mprotect(buffer + pagesize * 2, pagesize, PROT_READ) == -1)
        handle_error("mprotect");

    for (p = buffer ; ; )
        *(p++) = 'a';

    printf("Loop completed\n");     /* Should never happen */
    exit(EXIT_SUCCESS);
}

Recommended Posts

Ein Hinweis zu mprotect (2)
Ein Hinweis zu __call__
Ein Hinweis zum Unterprozess
Ein Hinweis zu KornShell (ksh)
Ein Hinweis zur TensorFlow-Einführung
Ein Hinweis zu [Python] __debug__
Python: Ein Hinweis zu Klasse 1 "Abstract"
Hinweis zu get_scorer von sklearn
Ein Hinweis zu Mock (Python-Mock-Bibliothek)
Hinweis zu awk
Nur eine Notiz
Ein Memo, dass ich das Pyramid Tutorial ausprobiert habe
Hinweis zu Zeigern (Go)
Ein Memorandum über Nan.
Datenanalyse in Python: Ein Hinweis zu line_profiler
Ein Hinweis zur neuen Stilbasisklasse
Modifikatoren zur Überprüfung von Memos mit MaxPlus
Memorandum über Korrelation [Python]
Ein Memorandum über den Python-Mock
Ein bisschen mehr über FIFO
Eine kleine Notiz, die auf printf folgt
Memo
Python Hinweis: Über den Vergleich mit is
Eine erfrischende Geschichte über Slice in Python
Eine launische Geschichte über Slice in Python
Ich habe eine Frage zu Leerzeichen
Eine kleine Beispielnotiz von list_head
Memo
Hinweise zum Schreiben von Python-ähnlichem Code
Eine Notiz, die numpy.array schön druckt
Die Geschichte der Verwendung von Python reduziert
[Übersetzung] Ein Memo über strukturierte Parallelverarbeitung. Oder besser gesagt, die go-Anweisung scheint schädlich zu sein
Ein Hinweis zu den Funktionen der Standard-Linux-Bibliothek, die sich mit Zeit befasst
Eine Notiz, in der ein Python-Anfänger stecken blieb
[Hinweis] Lesen Sie eine Datei aus einem anderen Verzeichnis
Eine Geschichte über einen magischen Umbau, der Lubuntu in ein Chromebook bringt
Ich berührte "Orator" und machte mir eine Notiz
Ein Java-Programmierer studierte Python. (Über Typ)
Eine Geschichte über maschinelles Lernen mit Kyasuket
Memorandum zu Djangos QueryDict
Hinweise zum Aktivieren von PostgreSQL mit Django
Eine Geschichte über Python Pop und Append
Memo über Sphinx Teil 1 (Erstellen eines Projekts)
Über den 02. Februar 2020 * Dies ist ein Python-Artikel.
[Anmerkung] Eine Geschichte darüber, dass es nicht möglich ist, den Proxy mit pip zu durchbrechen