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。

相关推荐
杨凯凡13 小时前
IT日报|2026-11-13:GitHub 大规模凭据攻击、Signal 形式化验证、Claude 新模型与 AI 安全诉讼
人工智能·安全·github
P1Browser14 小时前
账号触发平台安全审核?拆解标准申诉流程与材料清单
大数据·人工智能·安全·多账号管理·指纹浏览器·账户安全·运营合规
Fnetlink117 小时前
2026年企业安全组网供应商方案推荐
安全
如夏倾城18 小时前
基于格的密码学
安全·密码学·量子计算·可信计算技术
如夏倾城19 小时前
QUIC——HTTP/3 的唯一底层传输协议 及 0-RTT恢复
网络·网络协议·tcp/ip·安全·http
KCENN1 天前
安全触边在电梯轿厢门防夹保护系统中的选型配置与长效维护要点
安全
雪落漂泊1 天前
Liunux进程(七):程序控制篇(中)
linux·运维·windows
小雉系统1 天前
BcoreOS安全通信架构:FsSession 抗算法后门安全设计
算法·安全·架构
承渊政道2 天前
Fooocus本地AI绘图教程:Windows部署、低门槛生图与远程访问
人工智能·windows·cpolar·fooocus·生图
陈工大模型2 天前
收到乱码压缩包之后,我重新测了 7-Zip、Bandizip 和win解压缩
windows·电脑·软件工程·软件需求·7-zip