weixin_46374192 2023-07-25 22:52 采纳率: 0%
浏览 18
已结题

afl的llvm模式插桩改一个小需求

有人用过llvm的pass吗?afl里面有一个llvm的插桩模块,是通过一个pass实现的,它可以对一个C代码进程插桩操作。执行afl-clang-fast test.c -o test指令时,可以在test.c这个c代码里,在每一个基本块的第一条指令处插一个随机数,然后下一个基本块也插一个随机数,然后把这两个随机数异或一下得到一个值作为这条边的编号存在一个共享内存里。然后我想让他实现一个功能就是,修改pass的代码,对test进行插随机数的地方,插进去一句把这个随机数输出到一个外部文件的话。然后这个插桩后的可执行文件test,每次执行它的时候,就可以把实际执行的路径中的随机数给输出出来,这样我就知道test中哪条路径走过了。 但是这个pass应该怎么改,有人用过llvm的pass嘛?我感觉如果llvm用的好的话可能这就是一个小需求,但是我llvm pass学的不好,这周要做出来,有没有人帮帮忙呀(大哭)

  • 写回答

11条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-07-26 08:40
    关注
    获得2.70元问题酬金
    不知道你这个问题是否已经解决, 如果还没有解决的话:
    • 以下回答由chatgpt基于相关博客总结生成:

      解决方案:

      要修改afl的llvm模式插桩,以便将随机数输出到外部文件,需要对afl-llvm-pass.so文件进行修改。以下是解决该问题的步骤:

      步骤1: 下载afl插件源码

      首先,你需要下载afl插件源码。你可以在https://github.com/mirrorer/afl上找到源码。将源码下载到你的本地目录中。

      步骤2: 编译afl插件源码

      进入源码目录,并编译插件源码。运行以下命令:

      cd afl
      make clean all
      

      这将会编译插件并生成afl-llvm-pass.so文件。

      步骤3: 打开afl插件源码

      使用文本编辑器打开afl-llvm-pass.c文件,该文件位于afl/llvm_mode目录下。这是afl的llvm插件源码文件。

      步骤4: 查找插入随机数的位置

      afl-llvm-pass.c文件中,你需要找到基本块被插入随机数的位置。在该位置后面,你需要添加代码将随机数输出到外部文件中。

      afl在InstrumentBasicBlock函数中插入了随机数。你可以使用以下代码找到插入随机数的位置:

      static void InstrumentBasicBlock(BasicBlock &BB, const Module *M) {
        ...
      }
      

      步骤5: 添加代码将随机数输出到外部文件

      在找到插入随机数的位置后,你需要添加代码将随机数输出到外部文件中。可以通过以下步骤实现:

      5.1: 添加头文件

      在文件开头添加以下头文件:

      #include <fstream>
      

      5.2: 打开文件

      InstrumentBasicBlock函数中,找到插入随机数的位置后,添加以下代码来打开一个文件:

      std::ofstream outfile;
      outfile.open("random_numbers.txt", std::ios::app);
      

      这将会打开一个名为random_numbers.txt的文件,并以附加方式打开。

      5.3: 写入随机数

      在插入随机数的位置之后,添加以下代码来将随机数写入文件:

      outfile << random_number << std::endl;
      

      这将会将random_number写入random_numbers.txt文件中,并在每个随机数后添加一个换行符。

      5.4: 关闭文件

      InstrumentBasicBlock函数结束的位置,添加以下代码来关闭文件:

      outfile.close();
      

      这将会关闭random_numbers.txt文件。

      步骤6: 保存修改并重新编译插件

      保存修改后,重新编译插件源码。运行以下命令:

      make
      

      这将会重新编译插件并生成新的afl-llvm-pass.so文件。

      步骤7: 使用新的插件对C代码进行插桩

      使用新生成的afl-llvm-pass.so插件对C代码进行插桩。运行以下命令:

      afl-clang-fast test.c -o test -Xclang -load -Xclang /path/to/afl-llvm-pass.so
      

      确保将/path/to/afl-llvm-pass.so替换为新生成的afl-llvm-pass.so的路径。

      完成以上步骤后,每次执行插桩后的可执行文件test时,会将实际执行的路径中的随机数输出到random_numbers.txt文件中。你可以根据需要修改文件名和路径。

      希望以上解决方案对你有所帮助!如果你有任何其他问题,请随时提问。


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 系统已结题 8月2日
  • 创建了问题 7月25日

悬赏问题

  • ¥20 看图片)删除这个自动化录屏脚本就一直报错找不到脚本文件,如何解决?(相关搜索:bat文件)
  • ¥750 关于一道数论方面的问题,求解答!(关键词-数学方法)
  • ¥200 csgo2的viewmatrix值是否还有别的获取方式
  • ¥15 Stable Diffusion,用Ebsynth utility在视频选帧图重绘,第一步报错,蒙版和帧图没法生成,怎么处理啊
  • ¥15 请把下列每一行代码完整地读懂并注释出来
  • ¥15 pycharm运行main文件,显示没有conda环境
  • ¥15 寻找公式识别开发,自动识别整页文档、图像公式的软件
  • ¥15 为什么eclipse不能再下载了?
  • ¥15 编辑cmake lists 明明写了project项目名,但是还是报错怎么回事
  • ¥15 关于#计算机视觉#的问题:求一份高质量桥梁多病害数据集