快速业务通道

Linux下用gdb检测内核rootkit

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-04-21
过比较原始的系统调用地址和当前内核态中的系统
  调用地址我们就可以发现系统调用有没有被更改.原始的系统调用地址在编译阶段被写入两个文件:
  a.System.map该文件包含所有的符号地址,系统调用也包含在内
  b.系统初始化时被读入内存的内核映像文件vmlinux-2.4.x
  vmlinux-2.4.x文件通常以压缩的格式存放在/boot目录下,在比较之前解压这个文件,另一个问题是:
  我们的比较的前提是假设system.map及vmlinuz image都没有被入侵者更改,更安全的做法是在系统干净
  时已经创建这两个文件的可信任的拷贝,并创建文件的md5 hash.
  原文中也列举了一个内核模块[gcc -c scprint.c -I/usr/src/`uname -r`/include/ ]使用该模块打印系统
  调用地址,并自动写入syslog,这样可以进行实时的比较.
  在大多数被装载内核后门情况中,内核在系统初始化之后才被更改,更改发生在加载了rootkit的module或者被
  植入直接读写/dev/kmem的on-the-fly kernel patch之后.而通常情况下rootkit并不更改vmlinuz和system.map
  这两个文件,打印这两个文件中的符号地址就可以知道系统原始的系统调用地址,系统当前运行中的系统
  调用地址(可能被更改)可以同过/proc下的kcore文件得到,比较两者就知道结果.
  1.找出系统调用表地址:
  [root@rh8 boot]# cat System.map-2.4.18-13 | grep sys_call_table c0302c30 D sys_call_table
  2.使用nm命令可以打印出未被strip过的image文件中所有的符号地址:
  [root@rh8 boot]# nm vmlinux-2.4.18-13 | grep sys_call_table 拥有帝国一切,皆有可能。欢迎访问phome.net
  c0302c30 D sys_call_table
  使用gdb可以打印出所有的系统调用入口地址,这些对应的地址在内核源代码的entry.S文件中定义,例如:
  entry 0 (0xc01261a0)是sys_ni_syscall系统调用
  entry 1 (0xc011e1d0)是sys_exit系统调用
  entry 2 (0xc01078a0)是sys_fork系统调用
  #gdb /boot/vmlinux-2.4.*
  (gdb) x/255 0xc0302c30
  0xc0302c30 :  0xc01261a0 0xc011e1d0 0xc01078a0 0xc013fb70
  0xc0302c40 : 0xc013fcb0 0xc013f0e0 0xc013f230 0xc011e5b0
  0xc0302c50 : 0xc013f180 0xc014cb10 0xc014c670 0xc0107940
  0xc0302c60 : 0xc013e620 0xc011f020 0xc014bcd0 0xc013e9a0
  ...
  我们也可以通过系统调用名打印出系统调用的地址:
  (gdb) x/x sys_ni_syscall
  0xc01261a0 :   0xffffdab8
  ((gdb) x/x sys_fork
  0xc01078a0 :  0x8b10ec83
  要打印出当前运行系统中的系统调用地址我们给gdb加两个参数:
  a.第一个参数是内核映像文件vmliux-2.4.x
  b.第二个参数是/proc/kcore二进制文件
  #gdb /boot/vmlinux-2.4.* /proc/kcore
  (gdb) x/255x 0xc0302c30          
  0xc0302c30 :  0xc01261a0  0xc011e1d0  0xc01078a0  0xc88ab11a <<--
  0xc0302c40   0xc0302c50 : 0xc013f180  0xc014cb10  0xc014c670  0xc0107940
  0xc0302c60 : 0xc013e620  0xc011f020  0xc014bcd0  0xc013e9a0
  ...
  我们注意到第一行的0xc88ab11a这个地址明显不正常,这是系统调用号为3的系统调用,即
  sys_read (系统调用从0开始)
  我们说它不正常的显著标志是它的地址高于0xc8xxxxxx,Linux默认4GB线性地址,其中最高1GB
  0x00000000-0xffffffff为内核保留,当一个模块被插入内核时,vmalloc函数为其分配一段地址空间, 拥有帝国一切,皆有可能。欢迎访问phome.net
  这个地址通常从0xc8800000开始

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号