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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
java进制各种转换
public class BDUtils { /** * String -> Hex *  * @param s * @return */ public static String stringToHex(String s) { String str = ""; for (int i = 0; i < s.length(); i++) { int ch = s.charAt(i); String s4 = Integer.toHexString(ch); if (s4.length() == 1) {
IT工作者
2022/05/09
9720
IOS Widget(3):SwiftUI开发小组件布局入门
  经过上一篇文章,我们已经可以在桌面上展示出一个小组件出来了,你肯定想小试牛刀,动手改一改,那我们就从改小组件的布局做起吧。本文不会讲解Swift语法,如果是熟悉Flutter,Kotlin这种语言的,问题也不大。本文只讲解小组件中常用的SwiftUI组件。
用户1155943
2021/05/10
3.5K0
IOS Widget(3):SwiftUI开发小组件布局入门
STM32 W5500 实现 TCP,DHCP 和 Web服务器
Modbus协议是一种消息结构,广泛用于建立智能设备之间的主从通信。从主站发送到从站的 Modbus消息包含从站地址、“命令”(例如“读寄存器”或“写寄存器”)、数据和校验和(LRC 或 CRC)。
AnieaLanie
2021/12/25
4.5K0
Android实现烟花效果
HolderSurfaceView.java package com.lyc; import android.graphics.PixelFormat; import android.view.SurfaceView; public class HolderSurfaceView { private HolderSurfaceView() { } private SurfaceView mSurfaceView; private static HolderSurfaceView mHolderSu
用户7705674
2021/09/22
2K0
7-51单片机ESP8266学习-AT指令(测试TCP服务器--51单片机程序配置8266,用手机TCP调试助手发信息给单片机控制小灯的亮灭)
http://www.cnblogs.com/yangfengwu/p/8759294.html 如不做任何说明默认最头上的链接为上一篇链接,末尾的链接为下一篇链接 先把源码和资料链接放到这里 链接:
杨奉武
2018/04/19
2K0
7-51单片机ESP8266学习-AT指令(测试TCP服务器--51单片机程序配置8266,用手机TCP调试助手发信息给单片机控制小灯的亮灭)
使用AFL++-QEMU和libprotobuf进行高级二进制模糊测试——语法感知+内存持久模糊测试的实例
QEMU是AFL++支持的后端之一,用于Binary-only的模糊测试,这是通过patch QEMU来执行原始二进制文件,以收集覆盖率信息。
用户1423082
2024/12/31
4920
使用AFL++-QEMU和libprotobuf进行高级二进制模糊测试——语法感知+内存持久模糊测试的实例
使用 LLVM 实现一个简单编译器
作者:tomoyazhang,腾讯 PCG 后台开发工程师 1. 目标 这个系列来自 LLVM 的Kaleidoscope 教程,增加了我对代码的注释以及一些理解,修改了部分代码。现在开始我们要使用 LLVM 实现一个编译器,完成对如下代码的编译运行。 # 斐波那契数列函数定义 def fib(x)     if x < 3 then         1     else         fib(x - 1) + fib(x - 2) fib(40) # 函数声明 extern sin(arg)
腾讯技术工程官方号
2021/09/18
3.2K0
RCTF WriteUp(Misc篇+逆向篇)
可以看到一共分了两部分,第一部分是两个bitmap,第二步是BAR bitmap格式定义
ChaMd5安全团队
2019/05/30
2.8K0
C#知多少 | 每个版本都更新了什么?
总所周知,.NET5.0马上就要来了,最后一个预览版RC2也已经发布了,在11月的时候,我们就正式的发布了,然后我们就可以迁移使用了,当然今天说的重点不是.NET,今天说的是伴随着.NET5一起到来的C#9.0,既然要了解9.0,肯定要对之前的版本也稍微了解一下,至少不会面试的时候出现:XXX这个功能用过么,哪个版本出来的知道么?一问三不知的尴尬情景。虽然官网都有,但是我相信有一小部分不看,所以还是发出来吧。
老张的哲学
2022/04/11
1.9K0
C#知多少 | 每个版本都更新了什么?
CentOS7下编译安装libmodbus库
可以看到默认情况下libmodbus的头文件被放到/usr/local/include目录下,动态库文件放到/usr/local/lib目录下。
ccf19881030
2020/09/22
1.4K0
CentOS7下编译安装libmodbus库
针对二维码解析库的 Fuzzing 测试
在四月份的时候出了那么一个新闻,说微信有一个打开图片就崩溃的 bug,当时微信群里都在传播导致手机各种闪退。
evilpan
2023/10/17
4860
针对二维码解析库的 Fuzzing 测试
NDK--利用Camera和AudioRecord实现直播推流
当rtmp连接建立后,native层会回调方法:onPostNativeState,最终在PushHelper中调用VideoPush的startPush方法,该方法开启摄像头预览,将参数传给native层,并会不断调用onPreviewFrame方法将摄像头数据传递给native层。
aruba
2021/04/07
2.6K0
NDK--利用Camera和AudioRecord实现直播推流
android 高斯模糊实现
高斯模糊 高斯模糊就是将指定像素变换为其与周边像素加权平均后的值,权重就是高斯分布函数计算出来的值。 一种实现 点击打开链接<-这里是一片关于高斯模糊算法的介绍,我们需要首先根据高斯分布函数计算权重值,为了提高效率我们采用一维高斯分布函数,然后处理图像的时候在横向和纵向进行两次计算得到结果。下面是一种实现 public static void gaussBlur(int[] data, int width, int height, int radius,   float sigma) {  
xiangzhihong
2018/02/01
1.6K0
android 高斯模糊实现
RC522读卡器 M1卡学习总结(二)
大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。 Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺
全栈程序员站长
2022/09/28
1.3K0
【专业技术】搜狗歌词窗口如何来实现
大家都见过以前Sogou歌词窗口的样子吧,感觉是歌词的字体直接贴在windows桌面上一样,但是还可以用鼠标控制,这个是怎么做成的呢?其实我也不知道^_^,估计大家会说不知道还在这里写个啥?首先我不是
程序员互动联盟
2018/03/12
9010
【专业技术】搜狗歌词窗口如何来实现
Android MediaCodec图片合成视频
YUV是为了解决彩色电视与黑白电视的兼容性。黑白视频只有Y值,也就是灰度。而彩色电视则有YUV3个分量,如果只读取Y值,就只能显示黑白画面了。YUV最大的优点在于只需占用极少的带宽。
陨石坠灭
2020/01/21
4.5K1
Android MediaCodec图片合成视频
全志R128 SDK HAL 模块开发指南之 SPI
SPI是一种全双工同步串行接口,可以工作在Master模式和Slave模式,SPI主要有以下特点:
阿志小管家
2024/04/25
2160
全志R128 SDK HAL 模块开发指南之 SPI
Postgresql源码(83)执行器的结果接收系统——DestReceiver
执行器的工作包括:work、get result,之前work的内容已经介绍过了,这里分析下执行器如何拿到执行结果。
mingjie
2022/09/30
9130
【STM32H7教程】第53章 STM32H7的LTDC应用之汉字小字库和全字库制作
完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第53章       STM32H7的LTDC应用之汉字小字库和全字库
Simon223
2020/02/19
1.2K0
VS2017中使用CppSQLite报出编译器错误C2440
最近在VS2017中使用CodeProject上面的CppSqlite这个Sqlite的C++封装库时,引入了sqlite.lib以及CppSqlite的两个文件CppSQLite3.h和CppSQLite3.cpp,其地址为:CppSQLite - C++ Wrapper for SQLite,报错如下:
ccf19881030
2020/08/24
2.8K0
VS2017中使用CppSQLite报出编译器错误C2440
推荐阅读
相关推荐
java进制各种转换
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验