Windows堆dword shoot

Windows NT堆dword shoot

本文总结自《0day安全:软件漏洞分析技术》,加上了一些笔者的愚见。

前置知识

在用户态的NT堆中,Windows系统使用链表来维护一个堆中的空闲内存:

从Windows 7开始,Lookaside被低碎片堆(LFH)取代,但链表思想得以延续。

如果要分配一块内存,就要从空闲链表中移出一个节点:

cpp 复制代码
int remove (ListNode * node)      
{ 
	node -> blink -> flink = node -> flink; 
	node -> flink -> blink = node -> blink; 
	return 0; 
}

攻击原理

以通过修改函数返回地址实现劫持为例说明dword shoot的攻击原理。

假设内存中有一个边界检查不严格的堆块H1,我们可以通过堆溢出覆盖与H1相邻的堆块H2的块首,这样就修改了H2的blink和flink。H2在被分配时,原本会执行:

cpp 复制代码
	node -> blink -> flink = node -> flink; 
	node -> flink -> blink = node -> blink; 

但是我们修改blink为堆栈中函数的返回地址(Target),修改flink为shell code的地址(payload),于是就使得:

c 复制代码
// node -> blink -> flink = node -> flink;
*(Target) = payload;

这样就实现了任意地址写,当函数返回时,就执行了payload。

现代Windows相关防护机制

在现代版本的Windows中,启用了多种策略缓解堆溢出。这里提一下段堆机制,它和NT堆有许多差异,具体查看笔者的另一篇文章:

Windows堆管理:https://blog.csdn.net/Oorchi/article/details/161770852?spm=1001.2014.3001.5501

块首指针加密

块首中的指针(如Flink/Blink)可能被加密(与堆基址、全局Cookie进行异或),直接读取或预测其值几乎不可能。

元数据与用户数据分离

部分元数据(如块大小、状态)存储在独立的元数据区域,而非紧邻用户数据。

分配偏移随机化

在LFH中,每次分配的实际地址会在一个"桶"内随机偏移。

链表修改验证

链表操作前验证Flink->Blink == node && Blink->Flink == node

相关推荐
志栋智能1 小时前
超自动化安全的实施路径:从单点场景到体系化建设
运维·网络·安全·自动化
love530love1 小时前
Anaconda Navigator 升级后图形界面启动失败故障修复实录
人工智能·windows·python·anaconda·navigator
网络研究院1 小时前
端点安全完整指南
安全·端点·指南·网络研究观
LAM LAB2 小时前
【Quicker】拆分文本,按行读取文本执行循环写入
windows·quicker
xhtdj2 小时前
Build 2026:Azure API Management 推出统一模型 API 并新增 MCP 内容安全能力
人工智能·安全·azure
Splashtop高性能远程控制软件2 小时前
微软2026年6月补丁星期二技术分析:206个漏洞、3个已公开零日的分级修复方案
运维·安全·自动化·远程桌面·splashtop
一个扣子2 小时前
第四十篇:云端沙箱与检查点:自动化CI时如何保住安全底线、回滚无压力
安全·沙箱·企业级·回滚·claude code·检查点
许彰午13 小时前
30_Java Stream流操作全解
java·windows·python
2601_9619633813 小时前
技术解剖:哈希值、区块链与CA认证如何守护电子合同安全?
网络·人工智能·安全·区块链·智能合约·政务