Abbrechen eines Systemaufrufs mit ptrace ()

Aus Sicherheitsgründen verwende ich ptrace, um die Syscall-Nummer abzurufen, und wenn es sich um einen gefährlichen Anruf handelt (z. B. 10 für das Aufheben der Verbindung), möchte ich diesen Syscall abbrechen.

Hier ist der Quellcode für das Testprogrammdel.c. Kompilieren mitgcc -o del del.c.

#include <stdio.h>
#include <stdlib.h>
int main()
{
    remove("/root/abc.out");
    return 0;
}

Hier ist der Quellcode des Sicherheitsmanagerstest.c. Kompilieren mitgcc -o test test.c.

#include <signal.h>
#include <syscall.h>
#include <sys/ptrace.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <errno.h>
#include <sys/user.h>
#include <sys/reg.h>
#include <sys/syscall.h>

int main()
{
    int i;
    pid_t child;
    int status;
    long orig_eax;
    child = fork();
    if(child == 0) {
        ptrace(PTRACE_TRACEME, 0, NULL, NULL);
        execl("/root/del", "del",  NULL);
    }
    else {
        i = 0;
        while(1){
            wait(&status);
            if (WIFEXITED(status) || WIFSIGNALED(status) )break;

            orig_eax = ptrace(PTRACE_PEEKUSER,
                          child, 4 * ORIG_EAX,
                          NULL);
            if (orig_eax == 10){
                fprintf(stderr, "Got it\n");
                kill(child, SIGKILL);
            }
            printf("%d time,"
               "system call %ld\n", i++, orig_eax);
            ptrace(PTRACE_SYSCALL, child, NULL, NULL);
        }
    }
    return 0;
}

Erstellen Sie dieabc.out Datei, dann führen Sie das Testprogramm aus:

cd /root
touch abc.out
./test

Die Datei/root/abc.out sollte noch existieren.

Wie setze ich diese Anforderung um?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage