堆保护机制的原理
微软在堆中添加的安全校验操作:
- PEB random
- Safe Unlink:改写了操作双向链表的代码,在XP SP2后会提前验证堆块前向指针和后向指针的完整性
- Heap Cookie:类似于Security Cookie
- 元数据加密:块首中的一些重要数据在保存时会与一个4字节的随机数进行异或运算。
攻击堆中存储的变量
利用chunk重设大小攻击堆
Safe Unlink对从FreeList[n]上卸载chunk时对双向链表的有效性会进行验证,但是把一个chunk插入时没有进行校验。
会发生插入的操作:
- 内存释放后chunk不再被使用时会被重新链入链表
- 当chunk的内存空间大于申请的空间时,剩余的空间会被建立成一个新的chunk,链入链表中(利用)
示例代码:
#include <stdio.h>
#include <windows.h>
void main(){
HLOCAL hl;
HANDLE hp;
hp = HeapCreate(0,0x1000,0x10000);
hl = HeapAlloc(hp,HEAP_ZERO_MEMORY,0x10);
}
新chunk插入链表的过程在ntdll
的加载基址+0x11513
处,是修改chunk中下一chunk指针和上一个chunk指针的开始:
可以总结为以下几部分:
- 新chunk->Flink=旧chunk->Flink
- 新chunk->Blink=旧Chunk->Blink
- 旧chunk->Flink->Blink->Flink=新chunk
- 旧chunk->Flink->Blink=新chunk
如果将旧chunk的Flink指针覆盖为0xAAAAAAAA,就会变成:
- [0x003906A0]=0xAAAAAAAA
- [0x003906A0+4]=[0xAAAAAAAA+4]
- [0xAAAAAAAA+4]=0x003906A0
- [0xAAAAAAAA]=0x003906A0
示例代码:
#include