检测原理
申请内存通过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"); |