2021-8-20 11:11 上传
例如,一个进程产生一个处于挂起状态的新进程并修改该新进程的内存权限,试图执行 WriteProcessMemory。写入加密后的数据,不会触发 agent 的任何恶意指标;然而,发送到 EDR 平台的遥测仍然可以查看这些数据,并确定这些事件是否为潜在的 process hollowing 技术,所有这些发生不到一秒,这意味着 agent 需要许多数据对这些分析决定做支撑。
为了进一步了解这个数据流是如何工作的,我们需要了解 Windows 体系结构。对于初学者来说,Windows 系统提供了大量的函数和 API 调用,应用程序可以利用它们来执行代码。Windows API 的主要功能是在调用 syscall 执行低级汇编指令之前平衡所有堆栈寄存器。
系统调用比如 NTAllocateVirtualMemory 提供了一个低级接口,允许进程与操作系统交互。这些是过渡到内核的低级汇编指令,用于告诉 CPU 执行一个动作,如分配内存、创建文件或将存储在特定缓冲区的数据写入磁盘。这些 syscalls 驻留在 ntdll.dll 中,虽然其中许多没有文档记录,但 syscalls 不能被直接调用,因为它们只执行一个低级汇编指令。
登录/注册后可看大图
SourceZero_Red-Evolution-of-Detection-and-Response_Blog-Pt-1_Figure3_800x500-100_0.jpg (32.88 KB, 下载次数: 0)
下载附件
2021-8-20 11:11 上传
当一个进程被执行时,系统 Dll 被加载,此时 EDR agent 会去 hook 特定的 API 函数和 syscall,例如 VirtualAlloc 和 NTAllocateVirtualMemory。需要注意的是,每个 EDR 平台 hook 不同的函数和 syscall,提供不同的遥测,进而产生不同的信息和检测。随着执行流程的进行,触发 EDR 钩子,强制从系统 Dll 跳转到 EDR Dll 中执行,此时 EDR 执行一系列指令,最终还是要返回到系统 Dll 中。
登录/注册后可看大图
SourceZero_Red-Evolution-of-Detection-and-Response_Blog-Pt-1_Figure4_800x500-100_0.jpg (26.14 KB, 下载次数: 0)
下载附件
2021-8-20 11:12 上传
正如你所看见那样,同一个 syscall 被调用 2 次,这是由于用户模式和内核模式之间转换。系统调用函数可能以字符 NT 或 ZW 为前缀。NT 系统调用表示来自用户模式的调用,而 ZW 系统调用表示内核模式的调用。无论哪个,底层 syscall 指令都是相同的。
登录/注册后可看大图
Figure 5 NT and ZW Prefixes_1.png (92.59 KB, 下载次数: 0)
下载附件