您现在的位置是:首页 > 编程 > 

libdislocator原理及afl++的更新

2025-07-25 22:35:29
libdislocator原理及afl++的更新 检测原理申请内存通过mmap实现,最低申请两个页(默认4096一个页)last page通过mprotest设置为PROT_OE,无法读写执行代码语言:javascript代码运行次数:0运行复制mprotect(ret + PG_COUT(rlen + 8) * PAGE_SIZE, PAGE_SIZE, PROT_OE)之后将内存指针

libdislocator原理及afl++的更新

检测原理

申请内存通过mmap实现,最低申请两个页(默认4096一个页)

last page通过mprotest设置为PROT_OE,无法读写执行

代码语言:javascript代码运行次数:0运行复制
mprotect(ret + PG_COUT(rlen + 8) * PAGE_SIZE, PAGE_SIZE, PROT_OE)

之后将内存指针向右对齐,前面放len和alloc_canry

代码语言:javascript代码运行次数:0运行复制
ret += PAGE_SIZE * PG_COUT(rlen + 8) - rlen - 8;

  /* Store allocation metadata. */

  ret += 8;

  PTR_L(ret) = len;
  PTR_C(ret) = alloc_canary;

free的时候是将整个内存设置为PROT_OE

那么当程序存在堆溢出的时候,就会访问到PROT_OE内存而出错

free掉的内存因为PROT_OE也不可访问,可以检测uaf

新增特性

1、增加了对mac和FreeBSD 的兼容

代码语言:javascript代码运行次数:0运行复制
#ifdef __APPLE__
  #include <mach/vm_statistics.h>
#endif

#ifdef __FreeBSD__
  #include <sys/param.h>
#endif

2、 不是C11,重新定义max_align_t

代码语言:javascript代码运行次数:0运行复制
#if __STDC_VERSIO__ < 201112L || \
    (defined(__FreeBSD__) && __FreeBSD_version < 1200000)
// use this hack if not C11
typedef struct {

  long long   __ll;
  long double __ld;

} max_align_t;

#endif

、增加AFL_RADOM_ALLOC_CAARY选项

随机canary

代码语言:javascript代码运行次数:0运行复制
__attribute__((ctructor)) void __dislocator_init(void) {

  char *tmp = getenv("AFL_LD_LIMIT_MB");

  if (tmp) {

    char *             tok;
    unsigned long long mmem = strtoull(tmp, &tok, 10);
    if (*tok != '\0' || errno == ERAGE || mmem > SIZE_MAX / 1024 / 1024)
      FATAL("Bad value for AFL_LD_LIMIT_MB");
    max_mem = mmem * 1024 * 1024;

  }

  alloc_canary = ALLOC_CAARY;
  tmp = getenv("AFL_RADOM_ALLOC_CAARY");

  if (tmp) arc4random_buf(&alloc_canary, sizeof(alloc_canary));

  alloc_verbose = !!getenv("AFL_LD_VERBOSE");
  hard_fail = !!getenv("AFL_LD_HARD_FAIL");
  no_calloc_over = !!getenv("AFL_LD_O_CALLOC_OVER");
  align_allocati = !!getenv("AFL_ALIGED_ALLOC");

}

4、新增emalloc、ecalloc、erealloc

5、增加TAIL_ALLOC_CAARY(强制对齐的时候)

代码语言:javascript代码运行次数:0运行复制
 size_t rlen;
 if (align_allocati && (len & (ALLOC_ALIG_SIZE - 1)))
   rlen = (len & ~(ALLOC_ALIG_SIZE - 1)) + ALLOC_ALIG_SIZE;
 else
   rlen = len;

......
......
......
if (rlen != len) {

   size_t i;
   for (i = len; i < rlen; ++i)
     ret[i] = TAIL_ALLOC_CAARY;

 	}

需要开启AFL_ALIGED_ALLOC

代码语言:javascript代码运行次数:0运行复制
align_allocati = !!getenv("AFL_ALIGED_ALLOC");
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:2021-07-09,如有侵权请联系 cloudcommunity@tencent 删除size程序内存原理指针

#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格

本文地址:http://www.dnpztj.cn/biancheng/1207066.html

相关标签:无
上传时间: 2025-07-24 12:26:42
留言与评论(共有 16 条评论)
本站网友 房地产广告文案策划
22分钟前 发表
PAGE_SIZE
本站网友 backtrack
25分钟前 发表
新增emalloc
本站网友 高血压的危害
7分钟前 发表
重新定义max_align_t代码语言:javascript代码运行次数:0运行复制#if __STDC_VERSIO__ < 201112L || \ (defined(__FreeBSD__) && __FreeBSD_version < 1200000) // use this hack if not C11 typedef struct { long long __ll; long double __ld; } max_align_t; #endif
本站网友 同传
30分钟前 发表
新增emalloc
本站网友 倭寇
17分钟前 发表
libdislocator原理及afl++的更新 检测原理申请内存通过mmap实现
本站网友 长春男科
11分钟前 发表
分享自作者个人站点/博客
本站网友 带头大哥777网易博客
14分钟前 发表
ecalloc
本站网友 更好
23分钟前 发表
原始发表:2021-07-09
本站网友 污垢
28分钟前 发表
增加AFL_RADOM_ALLOC_CAARY选项随机canary代码语言:javascript代码运行次数:0运行复制__attribute__((ctructor)) void __dislocator_init(void) { char *tmp = getenv("AFL_LD_LIMIT_MB"); if (tmp) { char * tok; unsigned long long mmem = strtoull(tmp
本站网友 江东中心幼儿园
0秒前 发表
不是C11
本站网友 龙华医院
15分钟前 发表
libdislocator原理及afl++的更新 检测原理申请内存通过mmap实现
本站网友 英国空姐
5分钟前 发表
最低申请两个页(默认4096一个页)last page通过mprotest设置为PROT_OE
本站网友 脖子除皱
10分钟前 发表
最低申请两个页(默认4096一个页)last page通过mprotest设置为PROT_OE
本站网友 正定电视台
29分钟前 发表
libdislocator原理及afl++的更新 检测原理申请内存通过mmap实现
本站网友 四川癫痫病
18分钟前 发表
libdislocator原理及afl++的更新 检测原理申请内存通过mmap实现