【论文分享】FCEP: A Fast Concolic Execution for Reaching Software Patches

这篇文章来源于CCF的C类会议SEKE 2021。文章主要介绍了一种快速到达软件补丁的混合执行技术。看这篇文章主要是看他如何快速生成到达补丁附近的输入。

背景

软件更新在带来新功能的同时,也有可能引入新的bug。因此,安全研究人员会在软件发布前测试更新的软件。许多研究者都在开发新技术来实现高覆盖率的测试组件。文章提到现有的concolic execution不足以在真实程序里快速,自动地生成测试样例。本文提出了一种基于concolic execution的方法来确保补丁的合法性和可靠性。

方法

输入包含两个,一个是新版本的程序和补丁,另外一个是从test suite 选择的一部分输入。输出是触发bug或者覆盖测试补丁行的输入。

image-20210915144433379

主要分为地址映射和定向混合执行两个步骤。地址映射部分分为构建控制流图、构建映射和动态修正控制流图和调用图。

生成调用图:根据补丁行所在的函数,将补丁分为几个集合。然后选择每个集合里的其中一行作为核心目标。这一行需要是补丁的核心部分。然后使用IDA Pro来静态分析新版本的程序,构建控制流图和调用图。然后使用核心目标来在控制流图中标记可能的执行路径,并且标记相应的函数调用路径。由于间接跳转和指针可能会影响静态分析的准确性,在后面的步骤中会动态修正CFG和CG。

构建映射:混合执行器使用初始输入去测试新版本的程序。当遇到一个分支时,执行器会生成一个新的状态,并且告诉address finder去找下一条地址的指令。然后将新的状态映射到这个地址,并将状态放在候选池里。当混合执行遇到分支时,会将新生成的分支状态加到执行树里。FCEP构造执行树和静态分析一样,把为true的状态放到左子树,false状态放在右子树。由于true分支和false分支和静态分析生成的cfg一样,所以每个分支的下条指令地址可以很快查询到。

动态修正CFG和CG:由于静态分析不能很准确地推断间接跳转和函数指针调用,在使用静态分析去指导混合执行的时候会存在很多false negative。如果FCEP遇到间接跳转和函数指针调用,就动态修正CFG和CG去获取路径更精确的信息。

目标搜索策略:

当遇到条件分支时,生成新的状态,并被放入候选池中。然后会根据搜索策略从候选池中选择一个新的状态去执行。在测试开始前,FCEP从调用图获取了每个函数的范围,并且从CFG中选择了一条被标记的路径,可以从main函数执行到核心目标。当执行完初始状态后,FCEP需要确定新生成的状态是否命中了目标函数。如果命中了,FCEP就会选择靠近目标的路径去继续执行。如果没有状态命中目标函数,FCEP会去寻找调用目标函数的函数caller,并且去确认是否有状态在caller地址范围里。

程序的代码地址不是连续的,但是函数内的地址是连续的。因此,当选择最近的状态时,采用新状态的地址减去目标指令的地址来作为依据。对于目标函数,目标是补丁行,对于调用链上的其他函数,目标是函数调用的那一行。

当新的分支状态生成时,FCEP就会去确认下条指令是否命中了目标函数,如果命中了,就给这个状态高优先级。当一条路径命中了核心目标代码,FCEP就会继续选择命中目标函数的状态,继续去混合执行,直到没有状态命中目标函数,或者超时了。在这个步骤中,FCEP只要执行高优先级的状态,直到所有高优先级的状态都被执行了。在这之后,对下一个核心目标继续上面的步骤。这个过程的目的是尽可能地测试离补丁较近的代码。

实验部分就不细说了,这次主要看的是文章的思想。

总结

总的来说是先用静态分析确定目标,再设计混合执行的搜索策略来测试补丁后的程序。混合执行的搜索策略是先在函数粒度上搜索目标函数,再在函数内搜索目标状态。这个思路也挺不错的。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在Android开发过程中,我们经常会遇到一些错误和问题。其中一个常见的问题是在构建应用程序时出现"execution failed for task ':app:kaptdebugkotlin'. > a failure occurred while"的错误信息。 这个错误通常是由于Kotlin Annotation Processing Tool (KAPT)出现问题导致的。KAPT是一个用于处理Kotlin注解的工具,它可以帮助我们在编译期间生成一些代码。当我们在项目中使用了一些需要处理的注解时,KAPT会尝试进行代码生成。 然而,有时候KAPT在处理注解时可能会出错。这可能是由于注解的定义不正确、注解处理器的问题、依赖冲突或其他原因引起的。当KAPT出现错误时,Gradle会抛出"execution failed for task ':app:kaptdebugkotlin'. > a failure occurred while"的错误信息。 要解决这个问题,我们可以尝试以下几个步骤: 1. 检查项目中使用的所有注解,并确保它们的定义是正确的。有时候注解的参数、类型或其他属性不正确可能导致KAPT出错。 2. 检查项目中使用的注解处理器,并确保它们是最新版本。有些注解处理器可能存在Bug或与其他依赖项冲突,导致KAPT出错。 3. 通过查看Gradle的日志输出,定位错误的原因。Gradle通常会提供更详细的错误信息,帮助我们找出问题所在。 4. 更新Gradle和Android Gradle插件的版本。有时候旧版本的Gradle或插件可能存在Bug,升级到最新版本可能有助于解决问题。 5. 检查项目的依赖项,确保没有版本冲突或不兼容的库。有时候不同库之间的版本冲突可能导致KAPT出错。 通过以上几个步骤,我们可以尝试解决"execution failed for task ':app:kaptdebugkotlin'. > a failure occurred while"的错误信息。如果问题仍然存在,我们可以尝试在开发者社区或相关论坛上寻求帮助,寻找其他解决方案。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

破落之实

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值