[LINUX] Une note sur mprotect (2)

Aperçu

Notez que je n'ai pas vraiment compris le mprotect régulier à la suite de strace

Qu'est-ce que mprotect (2)?

mprotect (2) est un appel système qui contrôle les autorisations de zone mémoire.

man mprotect(2)

#include <sys/mman.h>

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

Passez le pointeur, la taille et la somme logique des bits.

drapeau

Actuellement, les bits de protection qui peuvent être combinés en prenant le OU

Nom du drapeau Aperçu
PROT_NONE Aucune protection du tout
PROT_READ La page est lisible
PROT_WRITE La page est accessible en écriture
PROT_EXEC La page est exécutable

Erreur

En cas de succès, mprotect () renvoie 0. En cas d'erreur, -1 est renvoyé et errno est défini de manière appropriée.

errno Aperçu
EACCES Impossible de définir l'accès spécifié à la mémoire
EINVAL addr n'est pas un pointeur valide ou un multiple de la taille de la page système
ENOMEM Impossible d'allouer la structure à l'intérieur du noyau
ENOMEM [addr, addr+len-1]L'adresse de la plage n'est pas valide car l'espace d'adressage du processus, ou l'adresse de la plage pointe vers une ou plusieurs pages qui ne sont pas mappées.

Exemple d'utilisation

Un exemple de programme qui génère SIGSEGV en écrivant dans la mémoire dans la zone READ_ONLY.

SIGSEGV exécute lui-même le traitement géré à l'aide de sigaction.

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;
    

    //Modifications du comportement du signal
    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");

    //Allouer de la mémoire alignée
    buffer = memalign(pagesize, 4 * pagesize);
    if (buffer == NULL)
        handle_error("memalign");

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

    //Contrôler les autorisations de la zone de mémoire
    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

Une note sur mprotect (2)
Une note sur __call__
Une note sur le sous-processus
Une note sur KornShell (ksh)
Une note sur TensorFlow Introduction
Une note sur [python] __debug__
Python: une note sur les classes 1 "Résumé"
Remarque à propos de get_scorer de sklearn
Une note sur mock (bibliothèque fictive Python)
Remarque sur awk
Juste une note
Un mémo que j'ai essayé le tutoriel Pyramid
Remarque sur les pointeurs (Go)
Un mémorandum sur Nan.
Analyse de données en Python: une note sur line_profiler
Une note sur la nouvelle classe de base de style
Modificateurs de vérification des mémos avec MaxPlus
Mémorandum sur la corrélation [Python]
Un mémorandum sur le simulacre de Python
Un peu plus sur le FIFO
Une petite note qui suit printf
Note
Remarque Python: à propos de la comparaison en utilisant is
Une histoire rafraîchissante sur Slice en Python
Une histoire de mauvaise humeur sur Slice en Python
J'ai une question sur les blancs
Un petit exemple de note de list_head
Note
Notes pour écrire du code de type Python
Une note qui imprime joliment numpy.array
L'histoire de l'utilisation de la réduction de Python
[Français] Une note sur le traitement parallèle structuré. Ou plutôt, la déclaration go semble être nuisible
Une note sur les fonctions de la bibliothèque Linux standard qui gère le temps
Une note où un débutant Python s'est retrouvé coincé
[Note] Lire un fichier depuis un autre répertoire
Une histoire sur un remodelage magique qui met Lubuntu dans un Chromebook
J'ai touché "Orator" alors j'ai fait une note
Un programmeur Java a étudié Python. (À propos du type)
Une histoire sur l'apprentissage automatique avec Kyasuket
Mémorandum sur le QueryDict de Django
Remarques sur l'activation de PostgreSQL avec Django
Une histoire sur Python pop and append
Mémo sur Sphinx Partie 1 (Création d'un projet)
À propos du 02 février 2020 * Ceci est un article Python.
[Note] Une histoire sur l'impossibilité de percer le proxy avec pip