(九)体验静态分析工具
(一)初识软件分析(二)数据流分析基础(三)Datalog和程序分析(四)静态单赋值和稀疏分析(五)过程间分析(六)指向分析(七)抽象解释(八)SMT和符号执行(九)体验静态分析工具(十)Fuzzing 基础 这篇文章主要是体验各种程序分析的工具,对于网上已经写的很好的文章,采取了直接引用的方式。读者应该多了解引用的链接,感兴趣的话可以跟着其他人的文章做一做。 如果需要精通使用,程序分析框架的学习成本还是比较高的。但是强烈建议有时间的读者,可以玩一玩。 Java java 基本语法与 C++ 类似,不熟悉的读者可以参考教程学习:https://www.liaoxuefeng.com/wiki/1252599548343744 ,如果有编程基础,入门很快的。 Soot 以下引用内容来自 星雪亭的《Soot 使用笔记》,我对里面不太准确的内容进行了调整和改正。 1、soot 简介 Soot 是 McGill 大学的 Sable 研究小组自 1996 年开始开发的 Java...
(八)SMT和符号执行
(一)初识软件分析(二)数据流分析基础(三)Datalog和程序分析(四)静态单赋值和稀疏分析(五)过程间分析(六)指向分析(七)抽象解释(八)SMT和符号执行(九)体验静态分析工具(十)Fuzzing 基础 前言 我们程序分析的学习进入了下一个阶段。在第一篇文章中提到程序分析可以大体分成抽象和搜索两部分,之前都是学习了抽象的部分。我们从数据流分析开始,讨论了抽象的基本思想,分支(包括循环)如何合并,节点如何更新等知识。从理论层面,探讨了数据流分析的的抽象和转换函数必须满足的条件以及数据流分析的性质,因此我们介绍了格理论。特别地,详细介绍了 widening 和 narrowing 的方法。在这一部分,我们建立了对于抽象的方法的基本认识。 然后,我们学习的 Datalog ,从基本数理逻辑出发介绍了逻辑式编程语言,接着介绍了典型的 Souffle 语言和它在程序分析上的应用。 在数据流分析中有几种很典型的方法Def-use 和 SSA,Def-use...
(七)抽象解释
(一)初识软件分析(二)数据流分析基础(三)Datalog和程序分析(四)静态单赋值和稀疏分析(五)过程间分析(六)指向分析(七)抽象解释(八)SMT和符号执行(九)体验静态分析工具(十)Fuzzing 基础 前言 这一文章是理论课,对之前的程序分析的合理性和思路,进行了理论上的分析和论证,有助于读者培养程序分析的思维。程序分析的很多思路都是对具体的值具体的表达式进行了抽象,建立了具体空间和抽象空间的关系,抽象解释理论就是解释映射函数。 这个映射主要分成两部分: 具体化函数 γ\gammaγ 将抽象值映射为具体值的集合 抽象化函数 α\alphaα 将具体值的集合映射为抽象值 伽罗瓦连接 Galois Connection 假设抽象域上存在偏序关系。简便起见,这里假设具体值集合上的偏序关系为子集关系。但抽象解释理论支持其他偏序关系,比如超集。 注意下面特殊的字 虚 表示抽象域集合,甲 表示抽象域集合中的元素。任取两个集合中各自一个元素 X 和...
信息安全算法基础
C语言基础乘法逆元信息安全算法基础操作系统基础x86汇编基础信息论与编码 这篇文章是电子科技大学,计算机科学与工程学院,网络空间安全专业的《信息安全基础综合设计实验》的总结。本人将它视为复习总结,读者可以当作学习使用 C++ 编写密码学函数和使用密码学库的入门资料。由于包含了课程作业答案,所以明年的这个时候应该会隐藏文章。 数论基础 模指数运算 主要就是分治算法,避免计算过程中溢出。递归的写法要注意堆栈溢出,因为当 e 不等于 0 的时候,每一层递归都会有两个分叉,也就是 2^32 次方的话,就会有 2^32 次方分叉,程序非常慢。 123456789101112unsigned int mod_exp(unsigned int a,unsigned int e, unsigned int n) { if(e==0) { return 1; } if(e%2 == 0) { return mod_exp(a,e/2,n)%n*(mod_exp(a,e/2,n)%n)%n; } else { return...
(六)指向分析
(一)初识软件分析(二)数据流分析基础(三)Datalog和程序分析(四)静态单赋值和稀疏分析(五)过程间分析(六)指向分析(七)抽象解释(八)SMT和符号执行(九)体验静态分析工具(十)Fuzzing 基础 程序分析中的敏感性 看到一篇总记得比较有条理的博客:华为云社区的《静态代码分析敏感性概念》,本小节(程序分析中的敏感性)的内容全部来自该博客,本人只做了排版优化。 本文介绍几种在静态代码分析中的敏感性分析的概念。主要有流敏感(flow-sensitive),路径敏感(path-sensitive),上下文敏感(context-sensitive)和域敏感(field-sensitive)。所有的敏感性分析相对于非敏感性分析,在分析的准确性上,都会有很大的精度提升(如减少漏报和误报等),但是会在时间或者空间上有更大损耗。 流敏感(flow-sensitive) 流敏感分析,是指在分析时,区分程序的执行顺序的分析。如下面的两段代码: 代码片段一: 1234String name = "zhangsan";name =...
默克尔准备金(Merkle Tree Proof of Reserves)
what is Merkle Tree Proof of Reserves After FTX was hacked, many prevailing exchanges announced they would provide Merkle Tree Proof of Reserves to encourage transparency[1]. The Merkle tree proof of reserve is an essential cryptographic tool that is thought to boost the public confidence and transparency of user assets. It utilizes a particular data structure, Hash Tree or Merkle tree, to prove that the centralized exchange has adequate assets to serve its customers. The above picture from...
DFX Finance 攻击分析
信息 攻击者地址:0x14c19962e4a899f29b3dd9ff52ebfb5e4cb9a067 分析的交易:0x6bfd9e286e37061ed279e4f139fbc03c8bd707a2cdd15f7260549052cbba79b7 发起攻击的合约:0x6cfa86a352339e766ff1ca119c8c40824f41f22d 函数调用参数:https://fefu.io/eth/tx/0x6bfd9e286e37061ed279e4f139fbc03c8bd707a2cdd15f7260549052cbba79b7 tenderly:...
(五)过程间分析
(一)初识软件分析(二)数据流分析基础(三)Datalog和程序分析(四)静态单赋值和稀疏分析(五)过程间分析(六)指向分析(七)抽象解释(八)SMT和符号执行(九)体验静态分析工具(十)Fuzzing 基础 之前我们所有的分析都是没有函数调用的,也就是之前考虑的情况都是「过程内」的调用。本章将会考虑函数调用,开始「过程间」分析(Whole Program Analysis 或者 Link-time Analysis)的学习。 基本思路 每个过程内分析对应一个抽象域,然后函数调用时,每个函数都是新的过程内分析。那么,只要考虑两个过程内分析的衔接即可。例如对下面的程序,在函数 A 内调用函数 B 时,其实就是过程间分析,调用和返回时对节点进行转换即可。 1234567891011int B(x,y){ z = x+y; return z;}int A(){ int a = 10; int b = 20; int c = B(a,b); return...
(四)静态单赋值和稀疏分析
(一)初识软件分析(二)数据流分析基础(三)Datalog和程序分析(四)静态单赋值和稀疏分析(五)过程间分析(六)指向分析(七)抽象解释(八)SMT和符号执行(九)体验静态分析工具(十)Fuzzing 基础 简介 这一章是对数据流分析的拓展和补充,基本内容如下: 首先从 Def-Use...
(三)Datalog和程序分析
(一)初识软件分析(二)数据流分析基础(三)Datalog和程序分析(四)静态单赋值和稀疏分析(五)过程间分析(六)指向分析(七)抽象解释(八)SMT和符号执行(九)体验静态分析工具(十)Fuzzing 基础 前言 笔者在学习 Datalog 之前,已经学习过数据流分析,也学习过一门函数式编程语言,所以能够较为快速地接受新概念。如果读者觉得有些概念比较难以理解,可以搜索关键词学习。 文章引用部分较多中英夹杂,因为没有必要花时间翻译了,我只是在末尾简要用中文提炼我认为的重点,帮助读者理解。笔者没有刻意中英夹杂的意思,提高英文能力对深入最先进的或者较为小领域的知识,是非常重要的。 笔者并没有很扎实的数理逻辑知识,只学过本科计算机专业课离散数学,所以部分概念理解可能不准确。笔者也只是刚入门程序分析,并没有形成整个领域的系统认识,也不了解术语规定。如果发现有任何错误,请不吝斧正。 稳定翻译这篇更加全一些:《Datalog 引擎 Soufflé 指南》 预备知识 逻辑式语言 在之前我们完成了函数式编程 Haskell 的学习之后,开始接触逻辑式编程语言。直接看 wiki...