Android的fuzz测试技术之符号执行浅谈-android学习之旅(82)
简单的漏洞越来越少,需要改进目前的方法 :
通过符号执行,得出执行路径,然后在进行fuzzy是较为有效的方法之一
1)为待测单元自动地生成可到达的测试数据,即提高测试目标的覆盖率
2)根据特定的漏洞模式和路径条件,缩小 Fuzzing 测试范围,减少Fuzzing盲目性
符号执行(symbolic execution)是一种代码执行空间遍历技术。枚举了程序所有可能的路径,穷尽所有执行空间,给定漏洞特征,理论上可以检测所有符合特征的安全漏洞
#
过程内符号执行从 CFG 的入口点开始。将所涉及到的变量符号化(使用符号表示变量值),依次解析程序中的语句和指令,翻译为符号表达式。每个变量的值都由符号化的变量和常数构造表达式来表示,并在每一个结点记录变量的符号运算表达式。符号执行过程中遇到流程控制语句,则将条件判断语句对变量值的要求附加到路径条件中,使用约束求解器判定哪条分支可行,并根据预先设计的路径调度策略实现对该过程所有路径的遍历分析,最后输出每条可执行路径的分析结果
静态分析和动态符号执行的最大区别在于静态分析并不真正执行被测试程序
静态符号执行的核心思想是探索执行树(execution tree)上所有的控制路径(control path),前提是所有可能的输入值都被考虑到
可行路径的数量随着路径长度的增长呈现指数增长的趋势。因此,要把所有可行路径都探索完是几乎不可能的
Int x,y
If(x=hash(y))abort;
任意x对y赋值,求出hash(y),得到满足条件的解
例如y=5,hash(y)=2,求出,2,5满足条件
If(hash(x)=hash(y),动态也不行了,具体执行
Concretization,完了又回到符号执行
(conclic symbolic execution)
混合符号执行介绍
混合符号执行的核心思想是在程序真实运行过程中,运行时判断哪些代码需要经过符号执行,哪些代码可以直接运行。这样一来符号执行就充分利用了程序的运行时信息,提高了分析的精确性
如何知道哪些是符号值?
静态对变量符号化,需要源码(具体实现没研究)Klee需要源码,然后转换成中间代码IR(.BC文件)S2e可执行文件
源码插桩,二进制文件插桩
具体事例介绍
#include <stdio.h>
#include <string.h>
#include "s2e.h"
int main(void)
{
char str[3];
// printf("Enter two characters: ");
// if(!fgets(str, sizeof(str), stdin))
// return 1;
s2e_enable_forking();
s2e_make_symbolic(str, 2, "str");
if(str[0] == '\n' || str[1] == '\n') {
printf("Not enough characters\n");
} else ……
s2e_disable_forking();
}
if (size)
fb_info_size += PADDING;
p = kzalloc(fb_info_size + size, GFP_KERNEL);
char tmp_info[] = “drivers/video/fbsysfs.c”;
s2e_message(info);
u32 tmp_l = fb_info_size;
u32 tmp_r = size;
s2e_detect_int(&tmp_l, &tmp_r, 4, UADD);
控制权交给s2e
if (!p)
return NULL;
通过内联汇编向二进制代码中插入一条 x86 指令集中没有定义的指令,当 Linux 内核在 S2E 上执行到这里时,会识别这条指令并将控制权交给 S2E,S2E 会根据其中一个固定字节的值来选择我们编写的整数溢出检测插件,函数的参数会通过 RAX 等寄存器传入 S2E 以供使用
X86(bin)->ucode(IR) ->instrument->x86
1. 首先判断传入的左右操作数中是否有符号化数据,如果没有,直接返回,因为我们只关心符号值所影响到的数据。
2. 根据传入的整数溢出错误类型重构表达式,即整数溢出发生的验证条件
3. 将重构的表达式加入到当前路径下的约束表达式中,通过约束求解器进行求解 。
4. 如果存在可行解,则输出可行解并报告当前路径下存在整数溢出漏洞。
if(x==0xdeadbeef){
2. return 100/(x-0xdeadbeaf);
3. }
4. else
5. return 100;
当x为0xdeadbeaf时,代码会发生除0异常。在32bit空间上随机生成x的方式仅有1/232的概率触发除0异常。
void klee_div_zero_check(long long z) {
if (z == 0)
klee_report_error(__FILE__, __LINE__, "divide by zero", "div.err");
二进制符号执行介绍:
过于依赖程序源代码,可扩展性受限,运行平台苛刻,无法评估第三方模块、库函数的安全影响
二进制分析缺乏大量信息,没有程序变量的概念,处理的对象是内存单元和寄存器
低级指令系统也十分复杂
程序的执行轨迹包含的指令数目庞大
Android的fuzz测试技术之符号执行浅谈-android学习之旅(82)的更多相关文章
- android的Binder通信机制java层浅谈-android学习之旅(88)
1.Service Manager的Java代理对象 在Java层中,Service Manager的代理对象类型为ServiceManagerProxy.它继承并且实现了IServiceManage ...
- 浅谈android代码保护技术_ 加固
浅谈android代码保护技术_加固 导语 我们知道Android中的反编译工作越来越让人操作熟练,我们辛苦的开发出一个apk,结果被人反编译了,那心情真心不舒服.虽然我们混淆,做到native层,但 ...
- 浅谈Android保护技术__代码混淆
浅谈Android保护技术__代码混淆 代码混淆 代码混淆(Obfuscated code)亦称花指令,是将计算机程序的代码,转换成一种功能上等价,但是难于阅读和理解的形式的行为.将代码中的各种元 ...
- 浅谈Android应用保护(一):Android应用逆向的基本方法
对于未进行保护的Android应用,有很多方法和思路对其进行逆向分析和攻击.使用一些基本的方法,就可以打破对应用安全非常重要的机密性和完整性,实现获取其内部代码.数据,修改其代码逻辑和机制等操作.这篇 ...
- 浅谈Android应用性能之内存
本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 文/ jaunty [博主导读]在Android开发中,不免会遇到许多OOM现象,一方面可能是由于开 ...
- 浅谈Android Studio3.0更新之路(遇坑必入)
>可以参考官网设置-> 1 2 >> Fantasy_Lin_网友评论原文地址是:简书24K纯帅豆写的我也更新一下出处[删除]Fa 转自脚本之家 浅谈Android Studi ...
- 浅谈Android编码规范及命名规范
前言: 目前工作负责两个医疗APP项目的开发,同时使用LeanCloud进行云端配合开发,完全单挑. 现大框架已经完成,正在进行细节模块上的开发 抽空总结一下Android项目的开发规范:1.编码规范 ...
- 安卓开发_浅谈Android动画(四)
Property动画 概念:属性动画,即通过改变对象属性的动画. 特点:属性动画真正改变了一个UI控件,包括其事件触发焦点的位置 一.重要的动画类及属性值: 1. ValueAnimator 基本属 ...
- 【转】Android Canvas的save(),saveLayer()和restore()浅谈
Android Canvas的save(),saveLayer()和restore()浅谈 时间:2014-12-04 19:35:22 阅读:1445 评论:0 收藏: ...
随机推荐
- C实战:项目构建Make,Automake,CMake
C实战:项目构建Make,Automake,CMake 在本系列文章<C实战:强大的程序调试工具GDB>中我们简要学习了流行的调试工具GDB的使用方法.本文继续"C实战" ...
- Android简易实战教程--第四十九话《满屏拖动的控件》
今天做个有意思的效果吧,控件的拖拽,简单实用,逻辑清晰点3分钟看完. 说的很高大上,其实就是拖动Button按钮跟着鼠标位置满手机屏幕跑罢了. 直接上简单的代码吧: public class Main ...
- webpack2 配置 示例
// https://github.com/webpack-contrib/extract-text-webpack-plugin var webpack = require("webpac ...
- 学习Android路上的一些感慨和总结,慢慢来,比较快!
学习Android路上的一些感慨和总结,慢慢来,比较快! 一直想对自己的学习路程做一个总结,来告别某一个阶段的过去,迎接某一个阶段的来临,一直抽不出时间来,于是零零散散的写了点-,到现在,也已经积攒了 ...
- Android必知必会-自定义Scrollbar样式
如果移动端访问不佳,请使用–>GitHub版 背景 设计师给的设计图完全依照 IOS 的标准来的,导致很多细节的控件都得自己重写,最近的设计图中有显示滚动条,Android 默认的滚动条样式(带 ...
- iOS下JS与OC互相调用(一)--UIWebView 拦截URL
最近准备把之前用UIWebView实现的JS与原生相互调用功能,用WKWebView来替换.顺便搜索整理了一下JS 与OC 交互的方式,非常之多啊.目前我已知的JS 与 OC 交互的处理方式: * 1 ...
- 使用Spring+Junit4.4进行测试
http://nottiansyf.iteye.com/blog/345819 使用Junit4.4测试 在类上的配置Annotation @RunWith(SpringJUnit4ClassRunn ...
- Java进阶(三十八)快速排序
Java进阶(三十八)快速排序 前言 有没有既不浪费空间又可以快一点的排序算法呢?那就是"快速排序"啦!光听这个名字是不是就觉得很高端呢. 假设我们现在对"6 1 2 7 ...
- SpringMVC系列之(二) springMVC和Struts异同
Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面.Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块.使用 Spring ...
- Xdoclet + Ant自动生成Hibernate配置文件
在使用Hibernate的时候,过多的Hibernate配置文件是一个让人头疼的问题.最近接触了Xdoclet这个工具.它实际上就是一个自动代码生成的工具,Xdoclet不能单独运行,必须搭配其他工具 ...