Ptrace kill

Tout sur les langages de programmation.

Ptrace kill

Messagepar manticore » 18 Juin 2012, 09:52

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
manticore
Apprenti
Apprenti
 
Messages: 57
Inscription: 07 Février 2012, 16:50

Re: Ptrace kill

Messagepar Todd » 18 Juin 2012, 22:03

Salut,

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

Todd
Avatar de l’utilisateur
Todd
Modérateur
Modérateur
 
Messages: 1795
Inscription: 19 Avril 2009, 12:11

Re: Ptrace kill

Messagepar manticore » 19 Juin 2012, 07:13

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...
manticore
Apprenti
Apprenti
 
Messages: 57
Inscription: 07 Février 2012, 16:50


Retourner vers Programmation

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité