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

相关推荐
love530love5 小时前
OpenClaw Windows Companion 桌面客户端 连接 LM Studio 完整配置指南
人工智能·windows·python·openclaw
momodira86 小时前
暑期安全短视频大赛线上投票制作教程
安全
humors2218 小时前
新手笔记本/路由/手机安全问题小记
安全·华为·电脑·手机·路由器·笔记本·tplink
廋到被风吹走9 小时前
【AI】从“卖能力“到“卖信任“,合规与安全成为新战场
人工智能·安全
FrameNotWork9 小时前
HarmonyOS 6.0 文件加密与安全存储:从哈希到硬件级密钥管理全链路实战
安全·哈希算法·harmonyos
栩栩云生11 小时前
命令行的门槛从"会写"变成了"会拦"
安全·ai编程·命令行
GitLqr11 小时前
别再盲目复制了:彻底搞懂 CORS 的本质与那些“神坑”
安全·http·面试
xian_wwq12 小时前
【案例分析】Hugging Face生产基础设施入侵攻击分析
网络·安全
2401_8734794014 小时前
如何识别C2通信中的恶意出站IP?IP离线库+威胁情报融合方案
网络·tcp/ip·安全·ip
OpenAnolis小助手14 小时前
Anolis OS 23.5 发布:全新平台支持、DDE 桌面升级,安全与多架构能力再度跃升
安全·操作系统·龙蜥社区·anolis os·anolis os 23.5