ich durch einen Artikel here gehen und wurde das Code-Snippet Ich habe unten herauskopiert ausprobieren: -(ORIG_EAX * 4) in ptrace ruft
#include <sys/ptrace.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <linux/user.h> /* For constants
ORIG_EAX etc */
int main()
{ pid_t child;
long orig_eax;
child = fork();
if(child == 0) {
ptrace(PTRACE_TRACEME, 0, NULL, NULL);
execl("/bin/ls", "ls", NULL);
}
else {
wait(NULL);
orig_eax = ptrace(PTRACE_PEEKUSER,
child, 4 * ORIG_EAX,
NULL);
printf("The child made a "
"system call %ld\n", orig_eax);
ptrace(PTRACE_CONT, child, NULL, NULL);
}
return 0;
}
Ich habe einen Zweifel in Bezug auf was ORIG_EAX
genau und warum 4*ORIG_EAX
wird an den Ptrace-Aufruf übergeben. Ich nahm zunächst an, dass ORIG_EAX
, EBX
, ECX
usw. die Offsets in eine bestimmte Struktur wären, in der die Werte der Register gespeichert würden.
Also entschied ich mich, den Wert von ORIG_EAX direkt nach der Wartezeit zu drucken, indem Sie printf("origeax = %ld\n", ORIG_EAX);
verwenden. Der Wert war 11
. Also meine frühere Annahme bezüglich der Offsets war falsch.
Ich verstehe, dass der Anruf wait
ist beendet, wenn der Kind hat eine Statusänderung (in diesem Fall einen Systemaufruf) und ORIG_EAX würde die System-Rufnummer enthalten.
Warum wird jedoch ORIG_EAX * 4 an den Aufruf von ptrace übergeben?
Was ist mit Dfferenzen zwischen 32 und 64-Bit? Sollten wir das nicht auf Zeit kompilieren? –
Weiter ..., ist das nur ptrace x86? Wenn nicht, brauchen wir eine allgemeinere zielunabhängige Vorgehensweise! –
Es gibt definitiv eine Definition für ein AMD64 'user_regs_struct', aber ich bin mir nicht sicher, ob man Architekturen mischen und anpassen kann. IIRC die Kommentare in der 'ptrace' erwähnt die separaten Header waren ein Problem. Da 'ptrace' ein Syscall ist, sollte es funktionieren (Sie müssen vielleicht die Offsets für jede Architektur manuell wechseln), aber ich kann nicht sagen, dass ich es jemals versucht habe. –