我写了一个内核漏洞利用程序(用于最新的Win10 64位),该漏洞利用程序执行(或从内核返回)窃取Shellcode的令牌,该令牌位于用户区的VirtulAlloc'd内存中。就是说,当漏洞由管理员用户执行时,它可以正常工作,但如果由普通用户(中等完整性)执行,则崩溃并显示ATTEMPTED_EXECUTE_OF_NOEXECUTE_MEMORY (fc)

当我检查用户模式shellcode存储器的许可时,

(标准用户)

PXE at FFFF8542A150A010    PPE at FFFF8542A1402DF0    PDE at FFFF8542805BECA0    PTE at FFFF8500B7D94400
contains 8A000000269B1867  contains 0A0000001C4F2867  contains 0A0000002673C867  contains 0000000032E84025
pfn 269b1     ---DA--UW-V  pfn 1c4f2     ---DA--UWEV  pfn 2673c     ---DA--UWEV  pfn 32e84     ----A--UREV


admin

PXE at FFFF8944A2512028    PPE at FFFF8944A2405E48    PDE at FFFF894480BC9F28    PTE at FFFF8901793E5800
contains 0A000000060BD867  contains 0A0000003593E867  contains 0A0000000FBAB867  contains 000000001DFF4825
pfn 60bd      ---DA--UWEV  pfn 3593e     ---DA--UWEV  pfn fbab      ---DA--UWEV  pfn 1dff4     ----A--UREV


区别在于PXE级别,标准用户没有设置E位,而admin用户对usermode shellcode具有执行权限。
我尝试将shellcode实施为exploit(.exe)函数,因此将其放置在代码段中(它可能具有执行特权),但是相同(在PXE级别中未设置E)并崩溃尽管!vad命令输出EXECUTE_WRITECOPY

我检查了ProcessMitigationPolicyProhibitDynamicCode设置为0,所以我认为这不是问题。

最近你们在编写内核漏洞利用程序时如何执行shellcode?
(仅供参考,我已通过内核ROP禁用了SMEP,SMAP)。

评论

普通用户可能会遇到SMEP问题,因为CR4寄存器已更新,返回任何有效的用户区代码都会导致系统崩溃。

从这种意义上说,即使CR4寄存器中的SMEP位被清除,为什么普通用户也不会禁用SMEP?

#1 楼

到目前为止,我发现的是,根据英特尔手册,即使SMEP位为0,如果在处理页表的过程中有任何条目设置了execute disable位,也不会执行。从标准用户(中等IL)分配RWX内存时就是这种情况。通过在内核中映射可执行内存并在其中复制shellcode来利用漏洞。