54SA.COM|专注于系统运维管理,为中国SA提供动力!

54SA.COM|系统运维网

系统管理员之家Banner
当前位置: 主页 > Windows > 系统安全 > 安全策略 >

详解如何利用Windows系统设备驱动

分享到:
时间:2010-10-14 23:35来源:未知 作者:编辑部
设备驱动漏洞现在正在增长成为Windows 和其他操作系统安全的主要威胁。这是一个相关的新领域,但是很少有公开的技术文档讲述这个方面。据我所知,第一个windows 设备驱动攻击是由SEC-LABS小组在Win32 Device Drivers Communication Vulnerabilities白皮书中提到的。这个文章公开了一些有用的驱动溢出技术,并且描绘了未来研究的蓝图。

      第二个值得一读的文章是Barnaby Jack的文章,叫做“Remote Windows Kernel Exploitation Stepinto the Ring 0”。由于这方面技术文档的缺乏,我决定共享我自己的研究成果。在这个文章中,我将会介绍我的设备驱动攻击技术,提供一些详细的可用技术的细节,包括完整的攻击代码和用于测试的样例驱动的代码。

  读者需要拥有IA-32 汇编阅读能力和软件漏洞攻击经验。另外,强烈建议你要去阅读之前提过的两篇白皮书。

  实验环境的组建

  过程中我使用了我的小型“实验室”:

  - 一台1G 内存的电脑;

  - 虚拟机软件,比如Vmware;

  - windbg 或者softice。我在VMware 中使用第二种,但是它并不怎么稳定;

  - IDA 反汇编器;

  - 一些软件我会在后面提到。

  在虚拟机和主机之间使用pipe 进行远程调试,但是通常其他方式更好一点。如果你想进一步研究驱动的话,这个环境的组建是非常重要的。

  用户态代码(软件)在Ring3 模式下运行(它没有访问Ring0 模式的权限),并且不能直接访问操作系统的函数,如果想使用这些函数只能通过call请求他们。这个叫做函数封装。用户模式内存地址是由0x00000000 到0x7FFFFFFF。

  Windows 系统使用了两种权限模式(ring0 和ring3)。

  Driver loader

  在我发布那个简单驱动之前,我们先来简单看下如何加载它。这是实现这个功能的代码:

[责任编辑:admin]

      /* wdl.c */
  #define UNICODE
  #include 
  #include 
  #include 
  void install_driver(SC_HANDLE sc, wchar_t *name)
  {
  SC_HANDLE service;
  wchar_t path[512];
  wchar_t *fp;
  if (GetFullPathName(name, 512, path, &fp) == 0)
  {
  printf("[-] Error: GetFullPathName() failed, error = %d\n",GetLastError());
  return;
  }
  service = CreateService(sc, name, name, SERVICE_ALL_ACCESS, \
  SERVICE_KERNEL_DRIVER,
  SERVICE_DEMAND_START, \
  SERVICE_ERROR_NORMAL, path, NULL, NULL, NULL, \
  NULL, NULL);
  if (service == NULL)
  {
  printf("[-] Error: CreateService() failed, error %d\n",GetLastError());
  return;
  }
  printf("[+] Creating service - success.\n");
  CloseServiceHandle(sc);
  if (StartService(service, 1, (const unsigned short**)&name) == 0)
  {
  printf("[-] Error: StartService() failed, error %d\n", GetLastError());
  if (DeleteService(service) == 0)
  printf("[-] Error: DeleteService() failed, error = %d\n", GetLastError());
  return;
  }
  printf("[*] Staring service - success.\n");
  CloseServiceHandle(service);
  }
  void delete_driver(SC_HANDLE sc, wchar_t *name)
  {
  SC_HANDLE service;
  SERVICE_STATUS status;
  service = OpenService(sc, name, SERVICE_ALL_ACCESS);
  if (service == NULL)
  {
  printf("[-] Error: OpenService() failed, error = %d\n", GetLastError());
  return;
  }
  printf("[+] Opening service - success.\n");
  if (ControlService(service, SERVICE_CONTROL_STOP, &status) == 0)
  {
  printf("[-] Error: ControlService() failed, error = %d\n",GetLastError());
  return;
  }
  printf("[+] Stopping service - success.\n");
  if (DeleteService(service) == 0) {
  printf("[-] Error: DeleteService() failed, error = %d\n", GetLastError());
  return;
  }
  printf("[+] Deleting service - success\n");
  CloseServiceHandle(sc);
  }
  int main(int argc, char *argv[])
  {
  int m, b;
  SC_HANDLE sc;
  wchar_t name[MAX_PATH];
  printf("[+] Windows driver loader by Piotr Bania\n\n");
  if (argc != 3)
  {
  printf("[!] Usage: wdl.exe (/l | /u) driver.sys\n");
  printf("[!] /l - load the driver\n");
  printf("[!] /u - unload the driver\n");
  getch();
  return 0;
  }
  if (strcmp(argv[1], "/l") == 0)
  m = 0;
  else
  m = 1; // default uninstall mode
  sc = OpenSCManager(NULL, SERVICES_ACTIVE_DATABASE,
  SC_MANAGER_ALL_ACCESS);
  if (sc == NULL)
  {
  printf("[-] Error: OpenSCManager() failed\n");
  return 0;
  }
  b = MultiByteToWideChar(CP_ACP, 0, argv[2], -1, name, MAX_PATH);
  if (m == 0)
  {
  printf("[+] Trying to load: %s\n",argv[2]);
  install_driver(sc, name);
  }
  if (m != 0)
  {
  printf("[+] Trying to unload: %s\n",argv[2]);
  delete_driver(sc, name);
  }
  getch();
  }
  /* wdl.c ends */
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
用户名:
最新评论 进入详细评论页>>