2012-06-19 8 views
5

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?

Antwort

8

Der Parameter ist ein Offset in user_regs_struct. Beachten Sie, dass jeder von diesen eine unsigned long ist, um den 11. Eintrag (orig_eax) zu erhalten, beträgt der Offset in Bytes 44, (vorausgesetzt, Sie befinden sich natürlich auf einer x86-Maschine).

+1

Was ist mit Dfferenzen zwischen 32 und 64-Bit? Sollten wir das nicht auf Zeit kompilieren? –

+0

Weiter ..., ist das nur ptrace x86? Wenn nicht, brauchen wir eine allgemeinere zielunabhängige Vorgehensweise! –

+0

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. –

Verwandte Themen