2008ǯ07��25��

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 �Ф��뤫�ɤ���Ĵ�٤Ƥߤޤ�����

  1. sys_call_table ��ϡ��ɥ����ǥ��󥰤���
  2. sys_call_table �� export ����ʤ��Ȥ⥢�ɥ쥹��ͽ��Ĵ�٤Ƥ����ƥϡ��ɥ����ɤ��Ƥ��Ф褵�����Ǥ���̤���̤� vmlinux ���ĤäƤ���� sys_call_table �Υ��ɥ쥹���ñ��Ĵ�٤뤳�Ȥ�����ޤ���(/proc/kallsyms �Ǥ�Ĵ�٤���褦�Ǥ�)

    nm vmlinux|grep sys_call_table
    c02bc838 R sys_call_table
    

    ������Ϥ����ӤǤϤ�����ˡ�ǽ�ʬ���⤷��ޤ���͡�

  3. sys_call_table ��õ������
  4. �ϡ��ɥ����ɤ���ΤϤ���äȤʤ��Ȥ������� 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
klab_gijutsu2 at 09:00��Comments(3)��TrackBack(0)��kernel 

�ȥ�å��Хå�URL

���ε����ؤΥ�����

1. Posted by �Ȥ��꤬����   2008ǯ07��26�� 07:18
�� http://kstrax.sourceforge.net/

2. Posted by �ڤ�   2008ǯ10��15�� 19:20
kstrax��linux-2.6.27�ǤϤ��Ǥ˻Ȥ��ʤ��ä�������linux����API�Ѥ�ꤹ��;<
3. Posted by ����   2010ǯ08��06�� 12:52
����ˤ��

���Υڡ����򻲹ͤˤ��ơ���ʬ��Linux�ǤΥ����ƥॳ����եå����Ƥߤޤ�����

�����ǰ��֤Τ���������ϡ�ptrace�Ǥ���

�����ͥ�⥸�塼���Ȥ���ˡ�⤤���ΤǤ�����2.6.25�ʹߤǤϡ�sys_call_table��
�꡼�ɥ���꡼�ˤʤäƤ��ꡢ�եå����뤿��ˤϥ����ͥ�κƹ��ۤ�ɬ�פȤʤ�ޤ���

�ͤ������ˡ�ϡ��եå��������ץ�������ƥץ������Ȥ��Ƶ�ư����ץ�������
�񤭤ޤ���������ǡ�PTRACE_SYSCALL��Ȥäƥ����ƥॳ���������ľ����
�ҥץ������򥹥ȥåפ��ޤ���

�ҥץ����������ѥ쥸�����˥����ƥॳ����ξ���(�����Ȥ������ƥॳ�����̾��)
����Ǽ����Ƥ���Τǡ�������PTRACE_POKEDATA��Ȥäƽ񤭴����Ƥ���
�����ƥॳ����򹥤��ʤ褦�˽񤭴�����ޤ���

������ˡ���ȡ������ͥ�κƹ��ۤ�sys_call_table�Υ��ɥ쥹���狼��ʤ��Ƥ�
�եå����뤳�Ȥ��Ǥ���Τǡ�������Ǥ���

���ε����˥����Ȥ���

̾��:
URL:
  ����òµ­²ï¿½: ɾ��: ��    ��
 
 
 
Blog�⸡��
�ǿ�����
Archives
���Υ֥����ˤĤ���
DSAS�Ȥϡ�KLab �����ۤ����Ѥ��Ƥ��륳��ƥ�ĥ����ӥ��Ѥ�Linux�١����Υ���ե�Ǥ�������5����Υǡ������󥿤ˤƹ��ۤ������Ѥ��Ƥ��ޤ������桹��DSAS����Ȥ��䤹�����������ˡ������Ƥ����ϤDZ��ѤǤ��뤳�Ȥ��ܻؤ��ơ��������ɤ˶Ф���Ǥ��ޤ���
���Υ֥����Ǥϡ������ DSAS �ǻȤäƤ��뵻�ѤξҲ�䡢�¸����Ƥߤ���̤���𡢥ȥ�֥�˴������ޤ줿���ηи��̤ʤɡ���������������������򿥤�ޤ��ƾҲ𤷤Ƥ��������Ȼפ��ޤ���
�ǿ�������
<%==comments[n].author%>
<% } %>