LINUX.ORG.RU

подмена sys_execve


0

0

ядро 2.6.3 написал маленький модуль,который должен подменить системный вызов execve #include <linux/types.h> #include <linux/module.h> #include <linux/kernel.h> #include <linux/unistd.h> # define print(fmt, args...) printk( KERN_INFO "smotrel: " fmt, ## args) unsigned *sys_call_table;

int (*o_execve)(struct pt_regs); int n_execve (struct pt_regs regs){ print ("hello\n"); return o_execve(regs); }

unsigned *find_sc(void) { .... }

int init_module(){ print("module inserted\n"); sys_call_table=find_sc(); print("sys_call_table adress:0x%x\n",sys_call_table); o_execve=(void *)sys_call_table[__NR_execve]; print("execve in sys_call_table:0x%x\n",&sys_call_table[__NR_execve]); print("execve aress:0x%x\n",o_execve); //sys_call_table[__NR_chmod]=(unsigned)n_chmod; return 0; } void cleanup_module(){ //sys_call_table[__NR_chmod]=(unsigned)o_chmod; print("module removed\n"); } после выполнения insmod rmmod вывод такой : [root@localhost mod]# tail /var/log/messages Mar 25 05:18:38 localhost kernel: smotrel: module inserted Mar 25 05:18:38 localhost kernel: smotrel: sys_call_table adress:0xc0323be0 Mar 25 05:18:38 localhost kernel: smotrel: execve in sys_call_table:0xc0323c0c Mar 25 05:18:38 localhost kernel: smotrel: execve aress:0xc01099e0 Mar 25 05:18:42 localhost kernel: smotrel: module removed проверил все с помощью gdb- все адреса правильные.

anonymous

продолжение вопроса

(gdb) disas 0xc01099e0 Dump of assembler code for function sys_execve: 0xc01099e0 <sys_execve+0>: push %ebp 0xc01099e1 <sys_execve+1>: mov %esp,%ebp 0xc01099e3 <sys_execve+3>: push %esi .....

(gdb) info functions sys_execve All functions matching regular expression "sys_execve":

File arch/i386/kernel/process.c: int sys_execve(struct pt_regs);

и объявил я sys_exec правильно. но если раскомментировать строчки в init_module cleanup_module то после insmod начинает выдаваться сообщение Segmentation fault.

в чем я неправ? на других сист вызовах работает...проверил на sys_chmod все отлично. долгожданное hello появляется в логах.

в чем особенность sys_execve?

anonymous
()

обратите внимание на определение,

        asmlinkage int sys_execve(struct pt_regs regs)

regs - это именно регистры процесса, exec codepath туда пишет,
например новые значения regs->eip, regs->esp. а вы передаете
o_execve(regs) копию стэка регистров. в результате, при возврате
в user-space регистры все те же.

idle ★★★★★
()
Ответ на: комментарий от idle

Узнаю idle. Краткость - сестра таланта. :) Осталось только добавить ссылки на arch//entry.S и arch//kernel/process.c (sys_execve).

Murr ★★
()
Ответ на: комментарий от Murr

Привет Murr, давно не виделись :)

я иногда заглядываю сюда, что-то не видно ни тебя, ни Die-Hard.
куда все подевались? я лично лишился (почти) возможности писать
на этот форум, тк X-windows у меня только на работе, и то лень
грузить. а вы-то двое куда делись?

idle ★★★★★
()
Ответ на: комментарий от idle

<offtopic> Всегда знал, что настоящие хакеры пользуются только консолью. :) А что до форума, то не до Linux сейчас. Колупаюсь в более экзотических вещах в целях саморазвития. 8) </offtopic>

Murr ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.