Ich arbeite an einer Linux-Anwendung, die ptrace enthält, um einen anderen Prozess zu beobachten, der durch den Systemaufruf fork() erstellt wurde.Wie man EIP's Tracee Forked Procee ändert?
Streng genommen: Ich möchte eine Fehlerinjektion in den gegabelten Prozess implementieren (chile process oder "tracee").
Wie Sie in der Abbildung unten sehen:
der Tracer wird die regs (struct_user_regs) Struktur von der Tracee von PTRACE_GETREGS Anfrage mit. Danach ändert der Tracer den EIP-Wert des Tracees (wenn der Kernel in tracee wechselt, wird die Reihenfolge der Ausführung gegen den sogenannten Kontrollflussfehler CFE verstoßen). dann sendet die PTRAC E_CONT-Anfrage an tracee, um die Ausführung fortzusetzen.
Leider, nach der Änderung der EPI-Tracee, führt das Tracee seine Ausführung aufgrund (Segmentierungsfehler) nicht fort. Wie kann ich dem Tracee EIP einen anderen geeigneten Wert geben?
hier ist der Code
#include <sys/ptrace.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include<sys/user.h>
#include<sys/reg.h>
#include<stdlib.h>
#include<stdio.h>
#include <asm/ptrace-abi.h>
int main()
{
pid_t child;
int status;
int sum=0;
struct user_regs_struct regs;
child = fork();
if(child == 0) {
ptrace(PTRACE_TRACEME, 0, NULL, NULL);
printf("hello world 1\n");
printf("hello world 2\n");
raise (SIGINT); // just to move control to the tracer
printf("hello world 3\n");
printf("hello world 4\n");
printf("hello world 5\n");
exit(EXIT_SUCCESS);
}
else {
wait(NULL);
ptrace(PTRACE_GETREGS, child,NULL, ®s);
printf("\n EIP @ 0x %#lx\n",regs.eip);
//get the tracee EIP
long int new_eip=ptrace(PTRACE_PEEKTEXT, child,regs.eip,NULL);
//chabge EIP and poke it again
new_eip += ???; // make change that let to jump to another tracee instruction address (say to print hello world 5)
ptrace(PTRACE_POKETEXT, child,regs.eip,new_eip);
ptrace(PTRACE_CONT, child, NULL, NULL);
}
return 0;
}
Irgendwelche Gedanken? Vielen Dank für Ihre Hilfe.
Sie müssen Ihren Code anzeigen, wenn Sie erwarten, dass jemand herausfindet, was Sie falsch machen. – Barmar
@Barmar, Code wurde hinzugefügt :) –
Mit dem Debugger wie Gdb oder Qt Debugger kann ich nicht die Tracee debuggen. –