间接系统调用
本*v 发表于 湖南 二进制安全 837浏览 · 2024-05-22 09:15

0X1前言
接上文,由于中途出现一点小事情升学方面的耽误了下片这里补充下片文章,本文中介绍间接系统调用

0X2间接系统调用介绍
上文当中说的直接系统调用是一中技术,现在的红队和攻击者成员还是在使用这种技术,比如说加载shellcode或lsass转存成,但是目前已不足够在各个阶段当中规避EDR的查杀(内核回调,直接系统调用的return语句不在ntdll.dll的内存范围之内)那某EDR就明确为Win下的异常行为,并明确为入侵指标IOC,为了避免内EDR检测直接系统调用替换成间接系统调用,原理上来说间接系统调用技术执行系统调用的逻辑变换,在ntdll.dll的内存中执行关键操作而不是在执行的EXE的内存当中执行这种符合windows的标准行为.

0X3正文
1.用户层面挂钩
2.直接系统调用
3.间接系统调用
这里会解释间接系统调用在对抗EDR当中的局限性

1.用户层API-HOOKING
用户层API挂钩赋予了EDR能进检查WindowsAPI执行的上下代码是否存在恶意行为,大部分EDR供应商通过替换特定的MOV指令使用内联挂钩变体,又或者是说用指令替换操作系统和操作数,取代了MOV指令后者负责系统服务号(SSN)移动到EAX上无条件跳转指令(jmp),实现定向到EDR的hooking.dll上并且EDR可以检查在本机API上下文中的代码是否是存在潜在恶意内容,代码不存在恶意内容就返回到内存当中后执行syscall,从用户层切换到内核层(如下图)

可以通过WinDbg或者其他调试器来看直接的EDR

2.直接系统调用查看我的文章第一篇
https://xz.aliyun.com/t/12903?time__1311=mqmhqIx%2BhD7iDs%3DA4Cw47q4y8fnwD&alichlgref=https%3A%2F%2Fxz.aliyun.com%2Fu%2F52388
实现工具Syswhisper2/3,HellsGate.Halo's Gate等

3.间接系统调用
间接系统调用是直接系统调用的演变,解决的是直接系统调用的EDR规避问题
1.syscall是发生在ntdll.dll内存当作的在EDR中是合法的.
2.return语句是在ntdll.dll内存当作并从ntdll.dll内存指向系统调用的内存集当中
参看如下图

放出代码

与直接系统调用的POC相比在间接系统调用的POC中需要动态提取SSN,还要动态提取系统调用指令的内存地址(线程完成),该指令为指向中syscall指令的内存地址的无条件跳转指令

如下代码

NtAllocateVirtualMemory PROC
    mov r10, rcx  
    mov eax, wNtAllocateVirtualMemory
    jmp QWORD PTR [sysAddrNtAllocateVirtualMemory]
NtAllocateVirtualMemory ENDP

直接系统调用和间接系统调用的poc汇编代码,能发现只有原生函数的存根的一部分以汇编代码的形式映射,间接系统调用POC中SSN是动态读取的全局声明的变量中与直接系统调用后的POC不同,间接系统调用POC是将指令替换为无条件跳转指令该指令指向的内存区域地址中的指令
syscall jmpsyscall ntdll.dll

两者编译出来的文件区别

这两者之间的线程调用堆栈时,直接系统调用系统调用本身已经返回执行发生在执行进程的exe文件内存当中,会导致调用的堆栈顶层帧来自exe内存,而不是ntdll.dll内存这种模式是具有信任度的.间接系统调用和系统调用的执行和返回都发生在ntdll.dll内存当作通过将直接系统调用替换为间接系统调用生成的堆栈模式更像传统的执行模式,在对抗EDR时候很有用。

如下图

使用Process Hakcer再次检查堆栈帧,如果EDR使用ETW来分析完整的调用堆栈,也能检查到异常这个时候需要堆栈混淆.

总结
1.syscall发生在ntdll.dll内存当中,在EDR严重是合法的
2.return语句执行发生在ntdll.dll内存当作,并从ntdll.dll内存指向间系统调用的程序集的内存,这个行为比直接系统调用的行为更合法(高级一点的EDR会检查堆栈啥的)
3.间接系统调用是直接系统调用的改进存在局限性,比如说EDR使用ETW检查堆栈是否存在非法行为(接下来会更新总结ETW新老对抗手法)。

0 条评论
某人
表情
可输入 255
目录