首页
社区
课程
招聘
未解决 afl effector map为什么是按字节操作???
发表于: 2019-5-28 16:38 3176

未解决 afl effector map为什么是按字节操作???

2019-5-28 16:38
3176
最近看 american fuzzy lop 的源码,看到bitflip 8/8时遇到了一个eff_map的数组,eff_map的大小为输入的testcase1/8,那么eff_map的每个bit都应该是有意义的,但是为什么eff_map[]的值只有01两种情况?
求解释,万分谢谢!!!
#define EFF_APOS(_p)          ((_p) >> EFF_MAP_SCALE2)
#define EFF_REM(_x)           ((_x) & ((1 << EFF_MAP_SCALE2) - 1))
#define EFF_ALEN(_l)          (EFF_APOS(_l) + !!EFF_REM(_l))
#define EFF_SPAN_ALEN(_p, _l) (EFF_APOS((_p) + (_l) - 1) - EFF_APOS(_p) + 1)

  /* Initialize effector map for the next step (see comments below). Always
     flag first and last byte as doing something. */

  eff_map    = ck_alloc(EFF_ALEN(len));
  eff_map[0] = 1;

  if (EFF_APOS(len - 1) != 0) {
    eff_map[EFF_APOS(len - 1)] = 1;
    eff_cnt++;
  }

  /* Walking byte. */

  stage_name  = "bitflip 8/8";
  stage_short = "flip8";
  stage_max   = len;

  orig_hit_cnt = new_hit_cnt;

  for (stage_cur = 0; stage_cur < stage_max; stage_cur++) {

    stage_cur_byte = stage_cur;

    out_buf[stage_cur] ^= 0xFF;

    if (common_fuzz_stuff(argv, out_buf, len)) goto abandon_entry;

    /* We also use this stage to pull off a simple trick: we identify
       bytes that seem to have no effect on the current execution path
       even when fully flipped - and we skip them during more expensive
       deterministic stages, such as arithmetics or known ints. */

    if (!eff_map[EFF_APOS(stage_cur)]) {

      u32 cksum;

      /* If in dumb mode or if the file is very short, just flag everything
         without wasting time on checksums. */

      if (!dumb_mode && len >= EFF_MIN_LEN)
        cksum = hash32(trace_bits, MAP_SIZE, HASH_CONST);
      else
        cksum = ~queue_cur->exec_cksum;

      if (cksum != queue_cur->exec_cksum) {
        eff_map[EFF_APOS(stage_cur)] = 1;
        eff_cnt++;
      }

    }

    out_buf[stage_cur] ^= 0xFF;

  }

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 42
活跃值: (202)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2

我也注意到这个问题,只要文件8个字节中有一个字节有效,那么这8个字节在eff_map中都标记为有效。

#define EFF_APOS(_p)          ((_p) >> EFF_MAP_SCALE2)

宏变量EFF_MAP_SCALE2的注释"Scaling factor for the effector map"似乎说明这是有意为之,再结合blocks_eff_totalblocks_eff_select两个全局变量,似乎afl是把8个字节作为一个block,或类似粗计数或simplify_trace的性能折中。
我猜想这是基于这样的假设:程序输入中的data部分往往不是以单个byte甚至单个int出现,而是类似block的大段连续byte。

最后于 2019-8-21 20:43 被BJChangan编辑 ,原因:
2019-8-21 20:40
0
雪    币: 1196
活跃值: (73)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
3
谢谢您的回复,我也认识到这个问题了
2019-8-21 23:34
0
雪    币: 2588
活跃值: (1332)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
4
个人理解:因为这里设置 eff_map 是为了之后的启发式判断,而后面的文件数据变异都是 8/8 起步的,所以这里在 8/8 处进行判断也就合情合理了。还有一点点个人猜测:这里是 8bit 对应着 1byte,应该是byte级别下的启发判断的效率最高。
2019-12-11 10:59
0
游客
登录 | 注册 方可回帖
返回
//