Dont j'avais eu l'occasion de me pencher sur le code de Sebek[1].
Sebek fait partie du projet Honeynet et permet de logguer justement tout ce qu'il se passe sur le système.
Hélas, ce projet est propre à la branche 2.4 de Linux.
Par contre, dans leurs code, ils n'attaquaient pas directement la table des syscall via la variable exportée sys_call_table[] mais ils allaient la chercher directement en mémoire.
Voici la fonction chargée de cette tache:
unsigned long ** get_syscall_table(){
//----- data structure that holds system call table
unsigned long **sct;
unsigned long *p;
p = (unsigned long *)ptr;
//---- orig ver that looked for sys_exit didnt work on stock
//---- kerns.
if (p[__NR_close] == (unsigned long) sys_close){
sct = (unsigned long **)p;
break;
}
}
return sct;
}
Quand on y réfléchit bien, ce n'est pas bête du tout. En effet, bien que plus exportée, la fameuse sys_call_table[] existe toujours. Et si elle existe toujours, alors elle est calée quelque part en mémoire.
Attention toutefois, j'ai testé le code de sebek sur un 2.4.30 et celui ci n'ai jamais parvenu à trouver ma table des syscall.
Pour finir, après avoir modifier le code pour qu'il fonctionne malgré cela, le module à fait paniquer le kernel au bout de 3 ls, donc je pense que ce module n'est pas exploitable en production.
Sinon, si je me souviens bien, ton but était de logguer les accés aux fichiers ?! Une solution se basant sur le VFS ne pourrait elle pas fonctionner ?
# Vilain hack ...
Posté par LaBienPensanceMaTuer . En réponse au message Intercepter les syscall. Évalué à 2.
Sebek fait partie du projet Honeynet et permet de logguer justement tout ce qu'il se passe sur le système.
Hélas, ce projet est propre à la branche 2.4 de Linux.
Par contre, dans leurs code, ils n'attaquaient pas directement la table des syscall via la variable exportée sys_call_table[] mais ils allaient la chercher directement en mémoire.
Voici la fonction chargée de cette tache:
unsigned long ** get_syscall_table(){
//----- data structure that holds system call table
unsigned long **sct;
unsigned long ptr;
extern int loops_per_jiffy;
//----- find the system call table
sct = NULL;
for (ptr = (unsigned long)&loops_per_jiffy;
ptr < (unsigned long)&boot_cpu_data; ptr += sizeof(void *)){
unsigned long *p;
p = (unsigned long *)ptr;
//---- orig ver that looked for sys_exit didnt work on stock
//---- kerns.
if (p[__NR_close] == (unsigned long) sys_close){
sct = (unsigned long **)p;
break;
}
}
return sct;
}
Quand on y réfléchit bien, ce n'est pas bête du tout. En effet, bien que plus exportée, la fameuse sys_call_table[] existe toujours. Et si elle existe toujours, alors elle est calée quelque part en mémoire.
Attention toutefois, j'ai testé le code de sebek sur un 2.4.30 et celui ci n'ai jamais parvenu à trouver ma table des syscall.
Pour finir, après avoir modifier le code pour qu'il fonctionne malgré cela, le module à fait paniquer le kernel au bout de 3 ls, donc je pense que ce module n'est pas exploitable en production.
Sinon, si je me souviens bien, ton but était de logguer les accés aux fichiers ?! Une solution se basant sur le VFS ne pourrait elle pas fonctionner ?
[1] : http://www.honeynet.org/tools/sebek/(...)