AFL源码阅读笔记(一)—— gcc 普通插桩

闲话 近日所感

📜 满庭芳
蜗角虚名,蝇头微利,算来著甚干忙。事皆前定,谁弱又谁强。
且趁闲身未老,尽放我、些子疏狂。百年里,浑教是醉,三万六千场。
思量,能几许,忧愁风雨,一半相妨,又何须,抵死说短论长。
幸对清风皓月,苔茵展,云幕高张。江南好,千钟美酒,一曲满庭芳。

读苏轼的词,想到《道士下山》里范伟的一句话 “人生七十古来稀,十年少小,十年老弱;中间还剩五十年,五十年再分成日夜,还有二十五年,再加上刮风下雨、三灾六病,人这一辈子还能剩下多少好日子啊”。既然如此,为什么要拘泥于蝇营狗苟的名利欲知,当你发现人们对成功的多元化定义,就明白只以房子车子票子为标准是多么的粗鄙;当你向知识臣服致敬,才会发现人类的精神世界是如此的广博而伟大;当你看到80岁的人都活得比你精彩,才意识到年龄真的不足以设限。世事一场大梦,人生几度秋凉。就算一百年,我也宁愿醉他妈个三万六千场!

一、代码设计框架

插桩部分

  1. 普通插桩,针对源码的插桩:afl-gcc.c, afl-as.c, afl-as.h。可用编译器有 clang 和 gcc。
  2. llvm插桩,针对源码的插桩:

fuzzer 模块

  • afl-fuzz.c:实现 fuzzer 的核心代码,是 AFL 的主体。

二、普通插桩

2.1 afl-gcc.c

这个文件是 gcc 和 clang 的包装器,在这两个编译器的基础上做了一些改动(主要是插桩操作)。它代替了 gcc 和 clang 工作(a drop-in replacement for GCC or clang)。

前置知识 — C语言main函数的参数
main函数接受两个参数,int argc 和 char* argv[](或 char **argv),但他们有什么含义呢?
其实这是和命令行参数有关,argc是命令行所有参数的值;argv是各个参数。
使用以下代码(test_args.c)测试,首先打印argc的值,再依次输出argv的值(注意i = argc时输出一个默认值)。

/* test_args.c */
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv) {
    int i;
    printf("total %d arguments\n", argc);
    for (i = 0; i <= argc; i++) { printf("argument argv[%d] = %s\n", i, argv[i]); }
    return 0;
}

编写一个bash文件 args.sh,结果为 a.out,再输入若干个参数,打印相关信息。
#!/bin/bash
gcc test_args.c
./a.out 1 2 3 4
结果如下,共五个参数,默认参数为null。

2.2 afl-as.h 和 afl-as.c

在阅读这部分前需要先回顾下汇编的相关知识。AFL采用的汇编器是 GNU Assembler(简称为GAS)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值