Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >通过编译器转换(llvm pass)规避模糊测试的一些障碍

通过编译器转换(llvm pass)规避模糊测试的一些障碍

作者头像
用户1423082
发布于 2024-12-31 12:12:11
发布于 2024-12-31 12:12:11
9000
代码可运行
举报
文章被收录于专栏:giantbranch's bloggiantbranch's blog
运行总次数:0
代码可运行

这个是看一个文章的记录,算是简译吧

总的来说是通过llvm pass去优化代码的生成去提高AFL的代码覆盖率

AFL通过插桩获取的代码覆盖率,假如变异的样本触发的新的路径,就会加入到接下来的变异队列中

但是有一些情况,会给afl造成极大的障碍

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if (input == 0xabad1dea) {
  /* terribly buggy code */
} else {
  /* secure code */
}

afl是随机变异的,去变异生成一个完全一样的4字节的数,真是难于上青天

那怎么解决这个问题呢?

假如把上面的代码换成下面那样

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if (input >> 24 == 0xab){
  if ((input & 0xff0000) >> 16 == 0xad) {
    if ((input & 0xff00) >> 8 == 0x1d) {
      if ((input & 0xff) == 0xea) {
        /* terrible code */
        goto end;
      }
    }
  }
}

/* good code */

end:

现在一次比较一个字节,大大提升了中奖概率,从1/2^32降低到了1/2^9,即1/512

原文作者根据这个原理,把可能出现这个问题两种情况也写了pass:switch的选项,还有比较函数(memcmp,strcmp …)

LLVM Passes

作者共实现了3个pass

比较指令的:split-compares-pass strcmp和memcmp的: compare-transform-pass switch的:split-switches-pass

The split-compares-pass

其实除了有==,还有!=,>,<,>=,<=

首先把>=,<=这种拆分为两个,比如>=,一个是==,另一个是>

再将有符号的比较拆分为,符号位比较和无符号的比较

到这就只剩这四种比较了:<, >, ==, != ,而且都是无符号的,所以再将字符拆分成单字节就好了

The compare-transform-pass

原始

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if(!strcmp(directive, "crash")) {
  programbug()
}

改成一个一个比较

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if(directive[0] == 'c') {
  if(directive[1] == 'r') {
    if(directive[2] == 'a') {
      if(directive[3] == 's') {
        if(directive[4] == 'h') {
          if(directive[5] == 0) {
            programbug()
}

局限性:就是这个比较是文字字符串并且因此字符串本身及其长度在编译时已知

The split-switches-pass

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int x = userinput();
switch(x) {
  case 0x11ff:
    /* handle case 0x11ff */
    break;
  case 0x22ff:
    /* handle case 0x22ff */
    break;
  default:
    /* handle default */
}

思想是想转化为if else,之后在通过split-compares-pass来处理,但这可能不是生成最优代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if (x >> 24 == 0x00){
  if ((x & 0xff0000) >> 16 == 0x00) {
    if ((x & 0xff00) >> 8 == 0x11) {
      if ((x & 0xff) == 0xff) {
        /* case 0x11ff */
        goto after_switch;
      }
      goto default_case;
    }
    goto default_case;
  }
  goto default_case;
}
else if (x >> 24 == 0x00){
  if ((x & 0xff0000) >> 16 == 0x00) {
    if ((x & 0xff00) >> 8 == 0x22) {
      if ((x & 0xff) == 0xff) {
        /* case 0x22ff */
        goto after_switch;
      }
      goto default_case;
    }
    goto default_case;
  }
  goto default_case;
}

default_case:
  /* default case */

after_switch:

评价

作者还用libpng和harfbuzz对着几个pass进行了测试

Driller的test case

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1 int main(void) {
 2   config_t* config = readconfig();
 3   if(config == NULL){
 4     puts("Configuration syntax error");
 5     return 1;
 6   }
 7   if (config->magic != MAGICNUMBER) {
 8     puts("Bad magic number");
 9     return 2;
10   }
11   initialize(config);
12
13   char* directive = config->directives[0];
14   if(!strcmp(directive, "crashstring")) {
15     programbug();
16   }
17   else if(!strcmp(directive, "setoption")) {
18     setoption(config->directives[1]);
19   }
20   else{
21     _default();
22   }
23 
24   return 0;
25 }

有了pass,1分钟就通过了第7行的检查,60分钟生成了crashstring,但是最后没出来setoption

没有pass,可能在合理的时间都过不了第7行的检查

libpng

作者将afl分为两组

组A:1个master,3个slave,都是正常插桩 组B:1个master,1个slave,都是正常插桩,还有另外的,1个master,1个slave,都是加了pass的

A组发现了1459条路径B找到了2318条路径。

在代码覆盖率方面(使用lcov进行度量的),A组命中了libpng的2186行,而B组命中了2707行

通过看图,可以看到加了pass,比较随便过

harfbuzz

harfbuzz的测试设置与libpng的设置相同,但是测试仅运行了24小时。在测试结束时,A组发现2070条路径,而B组发现2150条路径。在代码覆盖率方面,A组达到3358行,而B组达到3474行,增长了3.5%。

效果还是比较明显的

参考原文

https://lafintel.wordpress.com/2016/08/15/circumventing-fuzzing-roadblocks-with-compiler-transformations/

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-09-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Python库pandas下载、安装、配置、用法、入门教程 —— read_csv()用法详解
🔥 Python开发者必备! 如果你正在学习数据分析或者处理大规模数据集,那么你一定不能错过 pandas 这个强大的数据处理库。本篇教程将从 pandas的下载与安装 到 配置与入门技巧,全面解析其核心函数之一——read_csv() 的使用方法。无论是 CSV文件的导入与解析,还是 数据清洗与格式化,都将带你快速上手,轻松解决日常开发中的数据处理难题!👇
猫头虎
2025/01/15
2.1K0
猫头虎 Python知识点分享:pandas--read_csv()用法详解
pandas 是 Python 数据分析的必备库,而 read_csv() 函数则是其最常用的函数之一。本篇文章详细解析了 pandas read_csv() 的各种用法,包括基本用法、参数设置和常见问题解决方案,让小白和大佬都能轻松掌握。
猫头虎
2024/07/20
4620
猫头虎 Python知识点分享:pandas--read_csv()用法详解
Python库pandas下载、安装、配置、用法、入门教程 —— `read_csv()`用法详解
摘要 Pandas是Python中强大的数据分析与处理库,尤其在处理表格数据时表现出色。其中,read_csv()是Pandas最常用的函数之一,用于读取CSV文件并将其转换为DataFrame。本教程将从零开始,教你如何安装和配置Pandas,并通过详细的代码示例,带你掌握read_csv()的用法。
默 语
2025/01/20
6930
深入理解pandas读取excel,txt,csv文件等命令
文档操作属于pandas里面的Input/Output也就是IO操作,基本的API都在上述网址,接下来本文核心带你理解部分常用的命令
梦想橡皮擦
2019/03/15
12.9K0
深入理解pandas读取excel,txt,csv文件等命令
Python读写csv文件专题教程(1)
Python的数据分析包Pandas具备读写csv文件的功能,read_csv 实现读入csv文件,to_csv写入到csv文件。每个函数的参数非常多,可以用来解决平时实战时,很多棘手的问题,比如设置某些列为时间类型,当导入列含有重复列名称时,当我们想过滤掉某些列时,当想添加列名称时...
double
2019/05/23
1.9K0
20个经典函数细说Pandas中的数据读取与存储
大家好,今天小编来为大家介绍几个Pandas读取数据以及保存数据的方法,毕竟我们很多时候需要读取各种形式的数据,以及将我们需要将所做的统计分析保存成特定的格式。
用户6888863
2021/12/10
3.4K0
20个经典函数细说Pandas中的数据读取与存储
数据分析工具篇——数据读写
数据分析的本质是为了解决问题,以逻辑梳理为主,分析人员会将大部分精力集中在问题拆解、思路透视上面,技术上的消耗总希望越少越好,而且分析的过程往往存在比较频繁的沟通交互,几乎没有时间百度技术细节。
网罗开发
2021/04/07
3.5K0
python-004_pandas.read_csv函数读取文件
pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。pandas提供了大量能使我们快速便捷地处理数据的函数和方法。你很快就会发现,它是使Python成为强大而高效的数据分析环境的重要因素之一。
用户7886150
2020/12/26
1.9K0
Python数据分析的数据导入和导出
数据分析的数据的导入和导出是数据分析流程中至关重要的两个环节,它们直接影响到数据分析的准确性和效率。在数据导入阶段,首先要确保数据的来源可靠、格式统一,并且能够满足分析需求。这通常涉及到数据清洗和预处理的工作,比如去除重复数据、处理缺失值、转换数据类型等,以确保数据的完整性和一致性。
鲜于言悠
2024/05/12
1.2K0
Python数据分析的数据导入和导出
数据导入与预处理-第4章-pandas数据获取
数据经过采集后通常会被存储到Word、Excel、JSON等文件或数据库中,从而为后期的预处理工作做好数据储备。数据获取是数据预处理的第一步操作,主要是从不同的渠道中读取数据。Pandas支持CSV、TXT、Excel、JSON这几种格式文件、HTML表格的读取操作,另外Python可借助第三方库实现Word与PDF文件的读取操作。本章主要为大家介绍如何从多个渠道中获取数据,为预处理做好数据准备。
IT从业者张某某
2022/11/12
4.4K0
数据导入与预处理-第4章-pandas数据获取
【python数据分析】Pandas数据载入
对于数据分析而言,数据大部分来源于外部数据,如常用的CSV文件、Excel文件和数据库文件等。Pandas库将外部数据转换为DataFrame数据格式,处理完成后再存储到相应的外部文件中。 Pandas 常用的导入格式:import pandas as pd
颜颜yan_
2023/10/16
5690
【python数据分析】Pandas数据载入
【Python环境】python 中数据分析几个比较常用的方法
1,表头或是excel的索引如果是中文的话,输出会出错 解决方法:python的版本问题!换成python3就自动解决了!当然也有其他的方法,这里就不再深究 2,如果有很多列,如何输出指定的列? 需求
陆勤_数据人网
2018/02/26
1.7K0
【Python环境】python 中数据分析几个比较常用的方法
Pandas数据读取:CSV文件
Pandas 是 Python 中一个强大的数据分析库,它提供了大量的工具用于数据操作和分析。其中,read_csv 函数是 Pandas 中最常用的函数之一,用于从 CSV 文件中读取数据。本文将详细介绍 read_csv 的基本用法,常见问题及其解决方案,并通过代码案例进行说明。
Jimaks
2024/12/18
8790
Python读写csv文件专题教程(2)
如果我想修改age列的数据类型为float,read_csv时可以使用dtype调整,如下:
double
2019/05/29
8600
Pandas read_csv 参数详解
在使用 Pandas 进行数据分析和处理时,read_csv 是一个非常常用的函数,用于从 CSV 文件中读取数据并将其转换成 DataFrame 对象。read_csv 函数具有多个参数,可以根据不同的需求进行灵活的配置。本文将详细介绍 read_csv 函数的各个参数及其用法,帮助大家更好地理解和利用这一功能。
霍格沃兹测试开发Muller老师
2024/04/25
6630
python 导入数据错误:UnicodeDecodeError: ‘utf-8’ codec can’t decode byte 0xb5 in position 0: invalid start
https://www.cnblogs.com/OliverQin/p/8966321.html
全栈程序员站长
2022/09/13
2.5K0
python 导入数据错误:UnicodeDecodeError: ‘utf-8’ codec can’t decode byte 0xb5 in position 0: invalid start
【数据处理包Pandas】数据载入与预处理
对于数据分析而言,数据大部分来源于外部数据,如常用的 CSV 文件、 Excel 文件和数据库文件等。 Pandas 库将外部数据转换为 DataFrame 数据格式,处理完成后再存储到相应的外部文件中。
Francek Chen
2025/01/22
5610
【数据处理包Pandas】数据载入与预处理
解决FileNotFoundError: [Errno 2] No such file or directory: '/home/bai/Myprojects/
在进行文件操作时,有时可能会遇到文件不存在的错误,其中一个常见的错误是FileNotFoundError: [Errno 2] No such file or directory。该错误意味着程序无法找到指定路径下的文件或目录。在本篇文章中,我们将探讨一些解决这个错误的方法。
大盘鸡拌面
2023/10/30
6.2K0
02.数据导入&清理1.导入csv文件2.导入文本文件3.导入EXCEL文件:4.解决中文路径异常问题5.导出csv文件6.重复值处理7.缺失值处理8.空格值处理
用pandas读取Excel文件时, 如提示:ModuleNotFoundError: No module named 'xlrd', 因为Excel需要单独安装xlrd模块进行支持。
用户1250179
2018/08/02
1.4K0
使用SQLAlchemy将Pandas DataFrames导出到SQLite
在进行探索性数据分析时 (例如,在使用pandas检查COVID-19数据时),通常会将CSV,XML或JSON等文件加载到 pandas DataFrame中。然后,您可能需要对DataFrame中的数据进行一些处理,并希望将其存储在关系数据库等更持久的位置。
py3study
2020/12/17
5.1K0
使用SQLAlchemy将Pandas DataFrames导出到SQLite
推荐阅读
相关推荐
Python库pandas下载、安装、配置、用法、入门教程 —— read_csv()用法详解
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验