В качестве упражнения (исследования безопасности) я пытаюсь реализовать упакованный системный вызов. Согласно документации getdents - вам нужно реализовать собственную структуру linux_dirent (https://linux.die.net/man/2/getdents64). Кажется, все это работает, но я не могу правильно прочитать имя linux_dirent.
Реализация linux_dirent:
struct mylkm_linux_dirent {
u64 d_ino;
s64 d_off;
unsigned short d_reclen;
char d_name[];
};
Завершение getdents () вызов:
/*
This method will call the original and then sift through results.
Method will remove results that contain the specified keyword.
*/
asmlinkage long mylkm_getdents(unsigned int fd, struct mylkm_linux_dirent * dirp, unsigned int count)
{
unsigned int size = 0;
unsigned int bpos = 0;
struct mylkm_linux_dirent* dir1 = NULL;
char * buffer_ptr = NULL;
char hide[] = "mylkm";
printk("mylkm: getdents() called - redirecting to original sys call.\n");
size = (*k_getdents)(fd, dirp, count);
printk("mylkm: bytes value returned by original getdents() call: %ld\n", size);
printk("mylkm: count value passed into original getdents() call: %i\n", count);
printk("mylkm: dirp pointer value: %p\n", dirp);
for (bpos = 0; bpos<size;)
{
buffer_ptr = (char*)(&dirp + bpos);
dir1 = (struct mylkm_linux_dirent*)buffer_ptr;
printk("mylkm: record length: %d\n", dir1->d_reclen);
printk("mylkm: record name: %s\n", dir1->d_name);
printk("mylkm: offset to next dirent: %lld\n", (long long)dir1->d_off);
bpos += dir1->d_reclen;
}
printk("mylkm: Completed mylkm_getdents() call\n");
return 0;
}
вывод журнала:
[ 1383.082213] mylkm: LKM v0.1 has been loaded.
[ 1389.397196] mylkm: getdents() called - redirecting to original sys call.
[ 1389.397207] mylkm: bytes value returned by original getdents() call: 496
[ 1389.397208] mylkm: count value passed into original getdents() call: 32768
[ 1389.397209] mylkm: dirp pointer value: 0000000002075370
[ 1389.397209] mylkm: record length: 65152
[ 1389.397210] mylkm: record name: \xffffffff\xffffffff\xffffffff\xffffffff\xffffffff\xffffffff
[ 1389.397210] mylkm: offset to next dirent: 34034544
[ 1389.397211] mylkm: Completed mylkm_getdents() call
Я попытался явно привести dir1-> d_name к указателю на символ. Передача указателя на символ в исходном вызове вылетает. Как получить правильный список?