linux �Υ����ƥॳ�����եå�����
�Ƕᡢ�Ȥ��륯�������ɥ������ʥǥХ��������ġ���ε�ư�����ˤʤꡢ����ư��ˤĤ��Ʋ��Ϥ��Ƥߤ뤳�Ȥˤ��ޤ�����
�ץ�������ǥХå���������Ϥ����������ɤ�ʥ����ƥॳ���뤬�ƤФ졢�ɤΤ褦�ʰ������Ϥ���Ƥ��뤫��Ĵ�٤뤳�Ȥ��Ǥ��� strace ������Í�ѤǤ���
��������strace �Ǥ� ioctl ���Ϥ����ʣ���ʥǡ�����¤��ɽ�����뤳�ȤϤǤ��ʤ����ᡢ�����ƥॳ�����եå����ư�����ɽ������Ȥ������ʤ��뤳�Ȥˤ��ޤ�����
��������� linux �ǥ����ƥॳ�����եå�������ˡ�ˤĤ���Ĵ�٤Ƹ����Ȥ������ճ��Ȥ�����������ˡ��Í�뤳�Ȥ��Τ�ޤ����Τǡ���Ƥߤ���ˡ����Ĥ��Ҳ𤷤����Ȼפ��ޤ���
��)����μ¸��˻��Ѥ��� linux kernel �ΥС������� 2.6.25.11 �Ǥ����ۤʤ�С������ǤϤ��μ¸��̤�ˤϤʤ�ʤ���礬����ޤ���
LD_PRELOAD ��Ȥäƥեå�����
�ޤ����ּ�ü���᤽���ʤΤ� LD_PRELOAD ����Ѥ��� hook ������ˡ�Ǥ���
����: ���Υ���� Unoh Labs: LD_PRELOAD��Ȥä�Ǥ�դδؿ��ƤӽФ��˥եå����Ƥߤ�
������������䤬���Ϥ������ץ������� libc �򥹥��ƥ��å���󥯤������ strip ���Ƥ���Ȥ����Х��ʥ�Ǥ����Τǡ���ǰ�ʤ��餳����ˡ�Ǥ� hook ���뤳�Ȥ�����ޤ���Ǥ�����
kernel module �ǥեå�����
���ˡ�kernel module ����Ѥ����եå���ĩ�路�Ƥߤޤ�����
����: Linux Kernel Hacking
������򻲹ͤˤ��ưʲ��Τ褦�� open ��եå����� kernel �⥸�塼�� ��񤤤Ƥߤ��ΤǤ��������ޤ�����ѥ���Ǥ��ޤ���
#include <linux/init.h> #include <linux/module.h> #include <linux/syscalls.h> #include <linux/utsname.h> MODULE_LICENSE("GPL"); asmlinkage int (*orig_open)(const char *pathname, int flags); asmlinkage static int hook_open(const char *pathname, int flags) { printk(KERN_INFO "hook_open(\"%s\", %d)\n", pathname, flags); return orig_open(pathname, flags); } static int hook_init(void){ printk(KERN_INFO "hook_init\n"); orig_open = sys_call_table[__NR_open]; sys_call_table[__NR_open] = hook_open; return 0; } static void hook_exit(void){ printk(KERN_INFO "hook_exit\n"); sys_call_table[__NR_open] = orig_open; } module_init(hook_init); module_exit(hook_exit);
�ɤ����åµï¿½ï¿½ï¿½ï¿½Ë¡ï¿½ï¿½ hook �Ф���Τ� kernel 2.4 �κ��ޤǤǡ� 2.6 ����ϥ������ƥ������ͳ���� sys_call_table ����ܥ뤬 export ����ʤ��ʤä��褦�Ǥ���
kernel �ѹ����ƤΥեå�
�ɤ��ˤ� 2.6.x �Ǥ� hook ������ˡ��̵���Τ��ʡ���Ĵ�٤Ƥߤ�Ȱʲ�����ˡ�򸫤Ĥ��ޤ�����
Re: using sys_mknod in init_module�᡼������Ƥȼ㴳�ۤʤ�ޤ�����x86 32bit �������ƥ�����ξ�� arch/x86/kernel/i386_ksyms_32.c �ذʲ���2�Ԥ��ɵ�����
extern void* sys_call_table[]; EXPORT_SYMBOL(sys_call_table);
kernel module �˰ʲ���������ɵ����뤳�Ȥ�̵���ӥ�ɤ��� insmod �����褦�ˤʤ�ޤ�����
extern void *sys_call_table[];
��® insmod ����
# dmesg -c # cat /etc/passwd > /dev/null # dmesg hook_open("/dev/null", 33345) hook_open("/etc/ld.so.cache", 0) hook_open("/lib/libc.so.6", 0) hook_open("/etc/passwd", 32768) hook_open("/etc/ld.so.cache", 0) hook_open("/lib/libc.so.6", 0)
�Фä��� hook ���뤳�Ȥ�����ޤ�����
kernel ���ѹ����ʤ��ǥեå�����
rootkit �δ���������������ΤǤ��� kernel ���ѹ����ʤ���� hook ����ʤ��Ȥ����Τ����ѤʤΤǡ�kernel ���ѹ���ä�����kernel module �Τߤ� hook �Ф��뤫�ɤ���Ĵ�٤Ƥߤޤ�����
- sys_call_table ��ϡ��ɥ����ǥ��󥰤���
- sys_call_table ��õ������
sys_call_table �� export ����ʤ��Ȥ⥢�ɥ쥹��ͽ��Ĵ�٤Ƥ����ƥϡ��ɥ����ɤ��Ƥ��Ф褵�����Ǥ���̤���̤� vmlinux ���ĤäƤ���� sys_call_table �Υ��ɥ쥹���ñ��Ĵ�٤뤳�Ȥ�����ޤ���(/proc/kallsyms �Ǥ�Ĵ�٤���褦�Ǥ�)
nm vmlinux|grep sys_call_table c02bc838 R sys_call_table
������Ϥ����ӤǤϤ�����ˡ�ǽ�ʬ���⤷��ޤ���͡�
�ϡ��ɥ����ɤ���ΤϤ���äȤʤ��Ȥ������� module �� init ���� sys_call_table ��õ������Ȥ����꤬�����ͤǤ���
Finding the Linux System Call table in 2.6 series kernels | Subversity
������� sys_call_table ��õ�����륳���ɤ��Ҳ𤵤�Ƥ���ΤǤ�����unlock_kernel ����ܥ뤬��������ʤ�����ӥ�ɤǤ��ޤ���Ǥ�����
unlock_kernel ������ˡ����褯 sys_call_table �������ˤ��륷��ܥ��į��Ƥ����Ȥ��� strstr �Ȥ�������ܥ뤬���礦���ɤ������ʤΤǡ��������Ѥ��� sys_call_table ��õ�������ɤ�Ҳ𤷤ޤ���
unsigned long **find_sys_call_table(void) { unsigned long **sctable; unsigned long ptr; sctable = NULL; for (ptr = (unsigned long)&strstr; ptr < (unsigned long)&boot_cpu_data; ptr += sizeof(void *)) { unsigned long *p; p = (unsigned long *)ptr; if (p[__NR_close] == (unsigned long) sys_close) { sctable = (unsigned long **)p; return &sctable[0]; } } return NULL; }
�ޤȤ�
����ϡ�������ϤΤ���ˤȤˤ����եå��������ä��ΤǤ�䶯������ˡ�ˤʤäƤ��ޤ��ޤ���������äȿ���������ˡ�ǥ����ƥॳ�����եå�������ˡ�����ꤽ���Ǥ���
�ޤ������󤤤���������ˡ��Ĵ�٤Ƥߤƥ����ƥॳ����Υեå��˶�̣���ФƤ����Τǡ��ޤ��̤���ˡ���Τä����ˤϾҲ𤷤Ƥߤ����Ȼפ��ޤ���
--hamano
�ȥ�å��Хå�URL
���ε����ؤΥ�����
���Υڡ����򻲹ͤˤ��ơ���ʬ��Linux�ǤΥ����ƥॳ����եå����Ƥߤޤ�����
�����ǰ��֤Τ���������ϡ�ptrace�Ǥ���
�����ͥ�⥸�塼���Ȥ���ˡ�⤤���ΤǤ�����2.6.25�ʹߤǤϡ�sys_call_table��
�꡼�ɥ���꡼�ˤʤäƤ��ꡢ�եå����뤿��ˤϥ����ͥ�κƹ��ۤ�ɬ�פȤʤ�ޤ���
�ͤ������ˡ�ϡ��եå��������ץ�������ƥץ������Ȥ��Ƶ�ư����ץ�������
�ñ¤¤Þ¤ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ç¡ï¿½PTRACE_SYSCALL��Ȥäƥ����ƥॳ���������ľ����
�ҥץ������򥹥ȥåפ��ޤ���
�ҥץ����������ѥ쥸�����˥����ƥॳ����ξ���(�����Ȥ������ƥॳ�����̾��)
����Ǽ����Ƥ���Τǡ�������PTRACE_POKEDATA��Ȥäƽñ¤´ï¿½ï¿½ï¿½ï¿½Æ¤ï¿½ï¿½ï¿½
�����ƥॳ����ò¹¥¤ï¿½ï¿½Ê¤è¤¦ï¿½Ë½ñ¤´ï¿½ï¿½ï¿½ï¿½ï¿½Þ¤ï¿½ï¿½ï¿½
������ˡ���ȡ������ͥ�κƹ��ۤ�sys_call_table�Υ��ɥ쥹���狼��ʤ��Ƥ�
�եå����뤳�Ȥ��Ǥ���Τǡ�������Ǥ���