SystemCrashDumpStateInformation加载驱动
作者:MJ0011 (tyjaaa_at_163.com)
来源:安全焦点
使用如下代码可将系统中的atapi.sys (如果你的机器磁盘PORT驱动是atapi.sys的话,如果是scsiport的话会有不同)加载到系统中。
模块名为dump_atapi.sys(如果已配置了生成dump则无法生效)
HMODULE hlib = LoadLibrary(“ntdll.dll”);
PVOID p = GetProcAddress(hlib , “NtSetSystemInformation”);
ULONG stat;
__asm
{
push 0
push 0
push 0
push 34
//SystemCrashDumpStateInformation
call p
mov stat ,eax
}
代码非常简单,而且不需要任何额外权限,user权限也可以调用
结合替换或感染atapi.sys则可加载自己的驱动
不过,只能加载而已,加载完了系统会将加载的信息保存到IopDumpxxxx结构中,等到KeBugCheckEx调用IopWriteCrashDump时会调用到这个驱动
也就是说,实现攻击所要条件:
1.宿主机关闭了crash dump 选项(貌似很多机器都关闭了,尤其是XX优化版,XX美化版)
2.宿主机上存在引发bsod的驱动程序(很多杀毒软件、HIPS都有这样的设计缺陷)
这两点条件具备则可达成攻击。但其实还有一些细节要处理,例如,部分HIPS会报警写SYSTEM32下文件,因此我们需要直接通过磁盘读写该文件
另外,需要让原本不生成crashdump 的机器调用IopWriteCrashDump也是需要一定方法的
下面说说主要原理:
系统生成crash dump(崩溃转储)的当时其实并没有写入文件,而是实现在pagefile.sys中分配预留一块区域,将物理内存写入这块区域,等重启时再转储到文件中
之所以这么做,是因为WINDOWS不希望在转储时(BSOD时)使用文件系统相关功能,因为它可能已经被破坏了,而磁盘驱动其实也是可能被破坏的,因此 WINDOWS在Config CrashDump时,将系统中的atapi.sys磁盘端口驱动备份了一份,以dump_xxxx.sys的方式加载,等到BSOD时调用此驱动来写入 磁盘。
这个功能还可以帮助我们做另一件事,例如系统原始的atapi.sys可能被HOOK了,那么我们可以利用dump_atapi.sys来写磁盘