About the SMM rootkit

来源:SoftRCE.net

其实SMM是早在97年就有的东西,我跟这个东西也算是有点渊源,之前在实验室做过一些关于这个的研究,但是远没有到rootkit的方向.之后在逛网站的时候发现一篇5.12时候的新闻:Researchers dig into x86 chips for stealthier rootkits,然后才重新回头去看了这个东西,也隔天就写了篇分析.不过功力尚浅,很多东西在Win32平台到现在我实验着还是有问题的.

SMM类似ICE,ICE是一种硬件调试机制,也是深入到CPU级别的最根本的调试,但是ICE在Intel公司对CPU的改革过程中变成了现在的Branch Trace(tr12)[1],而SMM也继承ICE的实现方式(但并不是直接的”复制”)独立成为新的机制,主要处理ACPI,详细的介绍看后面的[注][2].AMD 稍微显得逊色一些,之前的CPU版本可以利用XX软指令去改DR7,也就是说基本是ICE的直接复制.Intel也显示出优越性,一来Intel的SMM 是不支持调试触发的,因为Intel把SMM和ICE分开了,再者Intel的SMM也不支持微处理器的指令触发,只能由硬件中断(CPU,ACPI)来 引发.我也提到过一个很好的物理方法,就是用信号发生器和频率源去接芯片引脚… :)

由于太过于依赖硬件,CPU的支持很大程度上决定 了SMM的实现方式,而且不同的主板公司(主要是BIOS)也可以实现不同的SMI处理例程,在之前(2008.5.12)我个人觉得要做成 rootkit还是有不少问题的.由于SMM的特殊性:CPU不管是怎么切换,由SMI进入SMM或者由RSM切回保护模式,都是悄然无声的,OS是”不 知道”的.SMI handler是在POST的时候安装到SMRAM里的.要想rootkit,肯定要想办法遛进SMM.当时也很怀疑Sparks是不是要在类BSD系统 上演示,因为相对来说,WIN32更加的困难,有很多的限制,一方面和硬件关联太多,一方面又要PIO操作权限又要内存操作权限,不好处理.

要 在正常模式下做成rootkit,首先就要保证控制寄存器位的置位(D_OPEN),因为如果D_CLK位打上去的话,只读了,就失效了.想办法进 SMRAM?HSEG(正常系统模式下,0xa0000-0xbffff这段内存是给某些显卡的)看起来remap也不那么简单,位被限制的很死,而且一 旦到了Above段,更是一碰就挂…那就是想办法更改SMI Handler了,不过这个比较好检测,AV只要定时检查就能知道是不是有handler被修改了.要不然就是通过BIOS,那就更是多此一举,那么多驱 动要BIOS CALL,可以修改BISO直接就搞了[思路上就是动比如bus0-dev1-func0-0x30/33这几个寄存器,PCI配置头它们指示的是 expansion rom,会被map到比如0xC0000,刷进去,然后想办法hook int,10号或者其他号,10号想必大家都清楚,VGA小端口会调用比如Ke386CallBios交回控制权.这里还涉及一些VM86的东西,公开的 未公开的.推荐一下VBEMP x86 Project :) 做为副产品,你可以从里面得到关于以上东西的一些灵感.至于Re-flash,这个就不多说了,IO方法很多],但是通过BIOS也可以给SMM-RK做 个引子.

不过既然Sparks要在BH上演示,也只好要拭目以待,可惜的是,她在BH上的演讲并没有什么让我觉得为之一亮的地方.因为在BH之前PHRACK爆出的一篇文章里把基本的内容都含盖了:System Management Mode Hack .

Paper 里提到触发SMI是通过存取PCI配置寄存器(其实可以衍生出不少方法,比如APM.),类BSD系统上的.PIO 0xCF8-0xCFF,如果是新的PCI-Express MMIO更简单.Paper里只是简单提了下Code relocation,其实这个特性很强大.你可以修改state save map里的SMMBASE值,完成一些隐蔽工作.但是这里可能会有点问题,因为我在这里挂起了很多次.就是如果你需要装进DS,需要在SMM handler里自己从state save map里读出descriptor cache结构体的里CS段的地址值,shr 4后给DS,这样才是指向了重定位后的SMMBASE.其他的值也是一样,你可以修改CRx,CS,EIP,EFLAGS以及CPL(SS.DPL),来 实现模式切换(这个很有价值). 关于中断,SMM处理中断并不像Intel手册说的.先看看paper里的2.4.2 – SMM Details这一小节,其实中断确实会被屏蔽,但是paper里的”To enable that is needed to issue the IRET/IRETD instructions” 是不对的, 至少我没成功,我的方法是设置硬件中断例程[timer kick]. 后面又提到code relocation后会出现很多莫名其妙的问题,其实这个和前里提到的一样, CS:IP也需要你手动修改,取SMRAM里的SS,CS值,shr 4然后push入栈,取esp,retf就可以了.

todo… (原文在: http://hi.baidu.com/gz1x)

注:
[1] http://bbs.pediy.com/showthread.php?t=66975
[2] http://en.wikipedia.org/wiki/System_Management_Mode
http://www.biosren.com/thread-29-1-1.html
[3] Nice Links:
[如何跟踪ACPI代码] http://advdbg.com/blogs/advdbg_system/articles/14.aspx

相关日志

发表评论