检测原理
申请内存通过mmap实现,最低申请两个页(默认4096一个页)
last page通过mprotest设置为PROT_NONE,无法读写执行
1  | mprotect(ret + PG_COUNT(rlen + 8) * PAGE_SIZE, PAGE_SIZE, PROT_NONE)  | 
之后将内存指针向右对齐,前面放len和alloc_canry
1  | ret += PAGE_SIZE * PG_COUNT(rlen + 8) - rlen - 8;  | 

free的时候是将整个内存设置为PROT_NONE
那么当程序存在堆溢出的时候,就会访问到PROT_NONE内存而出错
free掉的内存因为PROT_NONE也不可访问,可以检测uaf
新增特性
1、增加了对mac和FreeBSD 的兼容
1  | #ifdef __APPLE__  | 
2、 不是C11,重新定义max_align_t
1  | #if __STDC_VERSION__ < 201112L || \  | 
3、增加AFL_RANDOM_ALLOC_CANARY选项
随机canary
1  | __attribute__((constructor)) void __dislocator_init(void) {  | 
4、新增emalloc、ecalloc、erealloc
5、增加TAIL_ALLOC_CANARY(强制对齐的时候)
1  | size_t rlen;  | 
需要开启AFL_ALIGNED_ALLOC
1  | align_allocations = !!getenv("AFL_ALIGNED_ALLOC");  | 
        
        