Windows堆dword shoot

张开发
2026/6/12 3:31:30 15 分钟阅读

分享文章

Windows堆dword shoot
Windows NT堆dword shoot本文总结自《0day安全软件漏洞分析技术》加上了一些笔者的愚见。前置知识在用户态的NT堆中Windows系统使用链表来维护一个堆中的空闲内存从Windows 7开始Lookaside被低碎片堆LFH取代但链表思想得以延续。如果要分配一块内存就要从空闲链表中移出一个节点intremove(ListNode*node){node-blink-flinknode-flink;node-flink-blinknode-blink;return0;}攻击原理以通过修改函数返回地址实现劫持为例说明dword shoot的攻击原理。假设内存中有一个边界检查不严格的堆块H1我们可以通过堆溢出覆盖与H1相邻的堆块H2的块首这样就修改了H2的blink和flink。H2在被分配时原本会执行node-blink-flinknode-flink;node-flink-blinknode-blink;但是我们修改blink为堆栈中函数的返回地址Target修改flink为shell code的地址payload于是就使得// node - blink - flink node - flink;*(Target)payload;这样就实现了任意地址写当函数返回时就执行了payload。现代Windows相关防护机制在现代版本的Windows中启用了多种策略缓解堆溢出。这里提一下段堆机制它和NT堆有许多差异具体查看笔者的另一篇文章Windows堆管理https://blog.csdn.net/Oorchi/article/details/161770852?spm1001.2014.3001.5501块首指针加密块首中的指针如Flink/Blink可能被加密与堆基址、全局Cookie进行异或直接读取或预测其值几乎不可能。元数据与用户数据分离部分元数据如块大小、状态存储在独立的元数据区域而非紧邻用户数据。分配偏移随机化在LFH中每次分配的实际地址会在一个“桶”内随机偏移。链表修改验证链表操作前验证Flink-Blink node Blink-Flink node。

更多文章