AFL插桩及覆盖率计算实现分析

afl-gcc.c

全局变量

as_path:保存as文件路径,AFL的as是对clang assembler的包装
cc_params:u8类型的二维数组,保存全部parse完毕后的AFL_PARAMS

函数

find_as:查找AFL_PATH路径下的afl-as文件,未找到报fatal退出
edit_params:根据main函数传入的argv解析AFL的调用参数,如AFL_CXX、AFL_CC路径,此处也获取了AFL_GCJ并有说明,如果你安装了GCJ和Eclipse,那么AFL可以在java上工作,但是对于没有handler的异常,AFL需要作修改去处理Java binaries非0的退出crash
main:afl-gcc的入口函数,通过调用find_as、edit_params确定文件和参数,通过execvp函数运行afl-g++、afl-gcc或afl-gcj

afl-as.c

as程序是AFL对clang assembler的包装,主要在链接阶段对目标程序“插桩”,“插桩”的汇编代码在afl-as.h中,在插桩过程中,首先要保持原有程序流程现场,其实现如下。

插桩代码中保存寄存器现场的实现
static const u8* trampoline_fmt_32 =
  "\n"
  "/* --- AFL TRAMPOLINE (32-BIT) --- */\n"
  "\n"
  ".align 4\n"
  "\n"
  "leal -16(%%esp), %%esp\n"    //将栈顶抬高16个字节
  "movl %%edi,  0(%%esp)\n"     
  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值