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。

相关推荐
福建佰胜张工9 小时前
SMC 薄型气爪 MHF2-16D1 深度解析:平行开闭、低剖面结构在自动化装配中的选型与落地
java·服务器·安全·自动化
catoop9 小时前
API Key 设计与安全生成方案:结构拆解、数据库设计与 Java 实现
java·数据库·安全
贾伟康12 小时前
【化学实验室|18】HarmonyOS ArkTS 权限与隐私实战:让 module.json5、功能说明和拒绝路径一致
安全·移动开发·harmonyos·arkts·arkui
wangruofeng12 小时前
黑色十月:AI 找到的漏洞,两小时数十万次利用
人工智能·安全·php
万联WANFLOW13 小时前
LiteLLM 1.107.0 投毒排查实战:依赖、Docker、CI 环境分别怎么查?
安全·docker·llm
A1Book14 小时前
Win11 开机项治理方案:四层扫描、分级决策与可回滚落地
windows
hz5678914 小时前
企业视频会议系统方案:总部与分支机构高效协同如何落地?
运维·服务器·网络·安全·实时音视频·信息与通信
三垣网安14 小时前
漏洞实战|高校虚拟实验平台报错型 SQL 注入漏洞复现
网络·经验分享·sql·安全·web安全·网络安全·水平越权
sun1536902757214 小时前
露天矿边坡滑坡怎么预警?QY-19GNSS 自动化地表位移监测系统介绍
运维·安全·自动化
长不大的杨瑞杰14 小时前
给 OpenCode v2 接入大模型:Provider、模型选择与 API Key 安全配置实战
人工智能·安全·ai·语言模型