Bonjour à tous.
J'ai recemment découvert la programmation de LKM (modules kernel pour le noyau linux). Ainsi, il me semblait que l'on pouvait TOUT faire en kernel mode, c'est pourquoi j'avais essayé de rédiger un petit rootkit pour essayer de comprendre le hijacking de fonction.
La théorie est plutot simple : je récupère l'adresse d'une fonction - qui est déjà exportée pour ne pas avoir à faire de recherches dans les fichiers systèmes - (j'ai choisi strstr ), puis j'écrase les 9 premiers octets de la fonction que je remplace par :
Cependant, lors de l'écriture de ces opcodes à la place des octets de strstr, mon kernel m'affiche une erreur et coupe le module. Voici le bout de code qui fait tout planter. J'ai indiqué l'étape qui causait une erreur.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 mov eax, <adresse de ma fonction> jmp eax
Voila, si l'un d'entre vous à une idée sur ce problème... Peut être qu'on ne peut pas tout faire dans l'espace noyau au final ! Ou peut être que je suis tout simplement mauvais programmeur (je débute).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 unsigned char hijack_backup[9]; /*Pour conserver les 9 premiers octets de la fonction*/ unsigned char hijack_code[9]; int start_hijack(void){ /*On vide le buffer*/ memset(hijack_code,0,9); /*On y copie les informations nécessaires*/ hijack_code[0] = '\x66'; /*MOV*/ hijack_code[1] = '\xb8'; /*EAX*/ memcpy(hijack_code + 2, (unsigned char*) &HiJack_hook,4); //HiJack_hook est le nom de la fonction vers laquelle je détourne strstr() hijack_code[6] = '\x66'; /*JMP EAX*/ hijack_code[7] = '\xff'; hijack_code[8] = '\xe0'; /*On sauvegarde ensuite les premiers octets de la fonction strstr(). */ memset(hijack_backup,0,9); memcpy(hijack_backup,(char*)(strstr),9); /*Puis on les remplace par notre saut inconditionnel vers la fonction de détournement.*/ memcpy((char*)(strstr),hijack_code,9); // [!] ERREUR [!] return 1; }
Merci d'avance pour le temps que vous m'accorderez.
Cordialement, Sat.
Partager