Heap Spray 技术要点
1、堆喷射堆块大小 ≈ 程序堆块分配大小,以减小堆空隙大小。
2、不能使用堆缓存块,否则可能破坏地址的可预测性,可通过申请6块相应大小的堆块来清空缓存。
3、精确定位ROP地址,目标地址如0x0c0c0c0c
至堆块数据起始地址的offset = ( 0x0c0c0c0c - UserPtr(堆数据起始地址))/2,IE7:0x5FA,IE8:0x5F4/0x5F6,IE9:0x5FC/0x5FE,Firefox9:0x606
,可能不同语言版本会存在偏差。
4、不同系统、不同浏览器版本喷射块大小:
1 | XP SP3 – IE7 block = shellcode.substring(2,0x10000-0×21); |
5、Nozzle
保护机制(IE):检测是否存在重复可转换成汇编代码的字段,若存在则阻止其内存申请。
6、BuBBle
保护机制(Firefox):检测JavaScript是否尝试重复申请 NOPs + shellcode (padding + rop chain + shellcode + padding)
的内存块,若发现包含这些字段则阻止其内存申请。
7、分配 随机数 + rop + shellcode + 随机数
的堆块,以保证各分配块都是不同的,以此绕过上述保护机制,主要针对IE9。
8、利用随机变量名 + 随机块
绕过 Firefox9 的保护。
9、HTML5 Heap Spray
:EUSecWest2012上的演讲主题,通杀Chrome、Firefox、IE9和Safari
a、利用canvas
标签定义图形,通过脚本控制每个像素的数据再进行喷射;
b、利用Web Worker
的多线程功能,加速堆喷射过程,但IE不支持Worker.