Page 1 sur 1

Ptrace kill

MessagePosté: 18 Juin 2012, 09:52
par manticore
Salut,

je m'attaque aux appels systèmes avec ptrace, j'essaye de tuer le fils (processus créer pour le debug).

Pour le tester j'ai écrit un bout de code, ou je me ptrace_traceme deux fois de suite, si mon kill fonctionne, je devrais avoir 2 fois un 0 en retour.

Code: Tout sélectionner
#include <sys/ptrace.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>


int main(void)
{
   pid_t pid;
   pid = getpid();

   printf("Process create with PID : %d\n", pid);
   printf("TraceME %d\n", ptrace(PTRACE_TRACEME,0,1,0));
   printf("KILL%d\n", ptrace(PTRACE_KILL,pid,1,0));
   printf("TraceME 2 %d\n", ptrace(PTRACE_TRACEME,0,1,0));
   
}


Et la sortie :
Code: Tout sélectionner
# ./armPtrace
Process create with PID : 450
TraceME 0
KILL-1
TraceME 2 -1


Comme on peut le voir, le 2ème appel à ptrace retourne -1 car il est déja sous debug. Le kill retourne -1 -> erreur.

J'ai essayer avec ptrace_detach, sans plus de résultat, et google me propose beaucoup de débugger, mais pas d'auto-debug.

p.s. je veux bien faire du debugging sur mon process (la technique d'anti-debug), le but n'est pas de faire un debugger et d'ouvrir un fork().

Merci

Re: Ptrace kill

MessagePosté: 18 Juin 2012, 22:03
par Todd
Salut,

c'est peut-être un problème de timing ? :? As-tu essayé d'ajouter des pauses entre ces différentes actions ? :roll:

Todd

Re: Ptrace kill

MessagePosté: 19 Juin 2012, 07:13
par manticore
Bien vu, j'y avais aussi pensé, mais c'est malheureusement pas ça.

J'ai enfin trouvé une référence intéressante sur ptrace :
hxxp://mikecvet.wordpress.com/2010/08/14/ptrace-tutorial/

Surtout le passage sur ptrace_traceme :

PTRACE_TRACEME

1 long ret = ptrace (PTRACE_TRACEME, 0, NULL, NULL);

This is the only ptrace operation which is used by the child. It’s purpose is to indicate that the child task is to be traced by a parent and to grant it necessary ptrace permissions. The 0 in the pid field refers to the child task’s parent. As soon as the child makes a call to any of the exec() functions, it receives a SIGTRAP, at which point it is stopped until the tracing parent allows it to continue. It is important for the parent to wait for this event to happen before performing any ptrace operations, including the configuration operations involved with PTRACE_SETOPTIONS.


En résumé, je fais n'importe quoi, je dis juste que je suis d'accord d'être "ptracé" (du verbe ptrace), et je fournis les permissions. Si je fais un appel execl("/bin/ls", "ls", NULL);, après mon traceme, un breakpoint trap est levé.

Donc je cherche toujours comment me ptracer deux fois de suite ;) Est-ce que quelqu'un aurait une solution ? J'ai voulu le faire avec un ptrace_attach mais la encore moins de résultats :
Code: Tout sélectionner
int main(void)
{
   pid_t pid;
   int status;
   char* test = "test";
   pid = getpid();

   printf("Process create with PID : %d\n", pid);
   printf("TraceME %d\n", ptrace(PTRACE_ATTACH, pid,0,0));
   printf("TraceME 2 %d\n", ptrace(PTRACE_DETACH,pid,0,0));
   printf("KILL%d\n", ptrace(PTRACE_ATTACH,pid,0,0));
}


Et la sortie :
Code: Tout sélectionner
# ./armPtrace
Process create with PID : 723
TraceME -1
TraceME 2 -1
KILL-1


Mais je n'arrive pas à m'attacher moi même je trouve cela surprenant...