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 收藏: ...
随机推荐
- hiredis的各种windows版本
hiredis的各种windows版本(金庆的专栏 2016.12)hiredis 是内存数据库 redis 的客户端C库, 不支持Windows.hiredis的Windows移植版本有许多:des ...
- linux内存管理初始化
内存管理子系统是linux内核最核心最重要的一部分,内核的其他部分都需要在内存管理子系统的基础上运行.而对其初始化是了解整个内存管理子系统的基础.对相关数据结构的初始化是从全局启动例程start_ke ...
- linux:关于Linux系统中 CPU Memory IO Network的性能监测
我们知道:系统优化是一项复杂.繁琐.长期的工作.通常监测的子系统有以下这些:CPUMemoryIO Network 下面是常用的监测工具 Linux 系统包括很多子系统(包括刚刚介绍的CPU,Memo ...
- cocos2dx 3.2之Lua打飞机项目
1 创建lua打飞机项目 cocos new T32Lua -dE:\Installed\cocos2d-x-3.2\cocos2d-x-3.2\projects -l lua 2 ...
- Java基本语法-----java数据类型的转换
前言 Java中可以进行不同数据类型的加减乘除运算吗?是可以的.在算术运算符中已经体验过如果两个整数(int)相除会去掉小数部分.如果需要保留小数部分,可以让除数或者被除数变为double类型的(5变 ...
- JDBC数据库连接简介(一)
jdbc的由来 odbc(open database connection) 最初各个数据库比如mysql和oracle等,虽然都支持sql,但是他们的连接方式是不一样的,需要按照相应的api来编写不 ...
- 两个activity或者activity和fragment传值
使用Fragment的时候可能需要在两个Fragment之间进行参数的传递,开始想着可以使用SharedPreferences进行处理,想想这些简单的参数没有必要使用这么麻烦的方式去实现,翻了一下Fr ...
- 【java虚拟机系列】从java虚拟机字节码执行引擎的执行过程来彻底理解java的多态性
我们知道面向对象语言的三大特点之一就是多态性,而java作为一种面向对象的语言,自然也满足多态性,我们也知道java中的多态包括重载与重写,我们也知道在C++中动态多态是通过虚函数来实现的,而虚函数是 ...
- iOS开发之*.a静态库注意事项
以*.a静态库的形式引入工程的(比如:libUploadLib.a),*.a里面的class有category形式实现时,除了在工程Target的 Build Phases里面的 Link Binar ...
- C++对象模型的那些事儿之四:拷贝构造函数
前言 对于一个没有实例化的空类,编译器不会给它默认生成任何函数,当实例化一个空类后,编译器会根据需要生成相应的函数.这类函数包括一下几个: 构造函数 拷贝构造函数 析构函数 赋值运算符 在上一篇博文C ...