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 收藏: ...
随机推荐
- zookeeper基本原理及适用场景 转:http://blog.chinaunix.net/uid-26748613-id-4536290.html
1.1 zookeeper简介 Zookeeper 是 Hadoop 生态系统中的协同实现,是Hadoop集群管理的一个必不可少的模块,它主要来控制集群中的数据,如它管理Hadoop集群中的NameN ...
- for循环创建文件夹
bash里面, for n in a b c; do mkdir $n/dir; done 这个会在a,b,c三个文件夹下创建一个名为dir的文件夹. 之前没有在语句后面加分号,导致在cmd界面提交不 ...
- activiti 动态配置 activiti 监听引擎启动和初始化(高级源码篇)
1.1.1. 前言 用户故事:现在有这样一个需求,第一个需求:公司的开发环境,测试环境以及线上环境,我们使用的数据库是不一样的,我们必须能够任意的切换数据库进行测试和发布,对数据库连接字符串我们需要加 ...
- 全文检索概念,Lucene大致结构
1.1 常见的全文检索 1) 在window系统中,可以指定磁盘中的某一个位置来搜索你想要得到的东西. 2) 在myeclipse中,点击Help->Help Contents,可以利用搜索功能 ...
- 4-sum问题
给定一个整数数组,判断能否从中找出4个数a.b.c.d,使得他们的和为0,如果能,请找出所有满足和为0个4个数对. #define SIZE 10 void judgeAndPut(int* arr, ...
- Eclipse打jar包,资源文件的读取
最近的工作中需要将java程序打一个jar包,然后在Linux中供调用.程序中需要读取一个配置文件.遇到了三个问题.第一个是依赖的第三方Jar包打成Jar包后找不到:第二个问题是资源文件所在的文件夹打 ...
- arm-linux内核编译过程小结
记在前面的杂七杂八 内核的生成,实际上最终的目的是生成一个binary文件zImage,大小2-5MB的数量级. 用户可以从kernel.org得到的tar.gz格式的内核源代码,此代码解压后,就会生 ...
- 开源项目——小Q聊天机器人V1.1
小Q聊天机器人V1.0 http://blog.csdn.net/baiyuliang2013/article/details/51386281 小Q聊天机器人V1.1 http://blog.csd ...
- C语言--static修饰函数
在C语言中,static的字面意思很容易把我们导入歧途,其实它的作用有三条. 介绍它的第一条也是最重要的一条:隐藏. 当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性 ...
- SQL性能优化应该考虑哪些?
1.调整数据结构的设计.这一部分在开发信息系统之前完成,程序员需要考虑是否使用ORACLE数据库的分区功能,对于经常访问的数据库表是否需要建立索引等. 2.调整应用程序结构设计.这一部分也是在开 ...