(六)指向分析
(一)初识软件分析(二)数据流分析基础(三)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...
(二)数据流分析基础
(一)初识软件分析(二)数据流分析基础(三)Datalog和程序分析(四)静态单赋值和稀疏分析(五)过程间分析(六)指向分析(七)抽象解释(八)SMT和符号执行(九)体验静态分析工具(十)Fuzzing 基础 数据流分析 基本思想:程序视作状态和状态的转移两部分组成,忽视状态转移的条件,分析状态转移时的变化。 近似的两种方案: 忽略程序的条件判断,认为程序的所有分支都有可能到达。 **控制流分叉合并。**这会大大的减少计算量。 这些性质在后面会解释。 符号分析 思想:对变量进行抽象,分析输入的符号和输出的符号,得到抽象的结果。在此基础上可自定义分类和类似地拓展,用更加抽象和概括的符号。例如,对于整数类型,我们可以分成零、正、负、未知四种输入和结果,而不考虑具体的数值。 按照状态转移,我们可能有多条执行路径能够到达目的点 A。例如,if 语句是典型的区分执行路径的的方式。由于未知结果的函数 func1 和 func2,a 最终的符号可能是正、负或者未知。那么,我们可以得到 2 条可能的执行路径(0、5、1、未知)或者执行路径(0、-1、1、...
geth源码学习——介绍
交易的签名理解收据receipt理解区块理解交易blockchain核心布隆过滤器原理forkId 解读TxList 解读oracle 原理和实现交易池分析MPT树区块同步geth源码学习——介绍How Geth starts its server 项目地址:https://github.com/learnerLj/geth-analyze 环境准备 为了方便修改源码后进行调试,建议在 Linux 系统运行,阅读源码时用主机系统可能相对方便。 安装虚拟机:建议 Ubuntu20.04,具体安装教程可见其他教程。希望读者有一定的 Linux 基础,熟悉常用命令,理解 Linux 配置文件的思想,会阅读命令行提示信息。安装好虚拟机后可设置代理(学习区块链必须要学会设置代理),自行寻找教程。 准备环境:安装 nodejs、npm、goland、typora、中文输入法(可以用百度输入法)、vscode、goland、git,新手自行寻找教程,很容易找到。 建议使用 godoc,然后输入命令 godoc --http...
乘法逆元
C语言基础乘法逆元信息安全算法基础操作系统基础x86汇编基础信息论与编码 辗转相除法 先温习辗转相除法和裴蜀等式: {ax+by=gcd(a,b)(b mod a)x+ay = gcd(a,b)(a mod(b mod a))x+(b mod a)y = gcd(a,b)((b mod a) mod(a mod(b mod a)))x+(a mod(b mod a))y=gcd(a,b)\begin{cases} ax+by=\mathrm{gcd}\left( a,b \right)\\ \left( b\,\,\mathrm{mod}\ a \right) x+ay\,\,=\,\,\mathrm{gcd}\left( a,b \right)\\ \left( a\,\,\mathrm{mod} \left( b\,\,\mathrm{mod} \ a \right) \right) x+\left( b\,\,\mathrm{mod}\ a \right) y\,\,=\,\,\mathrm{gcd}\left( a,b...
Haskell(二)函数式编程
Haskell(一)入门Haskell(二)函数式编程Haskell(三) MonadHaskell(四)总结和工具链Haskell(五) 总结和展望Haskell(六) Project Euler 练习1-26 首先,我们需要将自己的编程观念从命令式语言转换到函数式语言上面来。这样做的原因并不是因为命令式语言不好,而是因为比起命令式语言,函数式语言更胜一筹。 基本用法 先看一些简单的程序,了解基本用法。 斐波那契数列: 1fab n = if n==1||n==2 then 1 else fab (n-1) + fab (n-2) 也可以利用模式匹配写成下面的样子,这个类似于分支语句,叫做 Guards 1fab n | n==1||n==2 =1 | n>2 = (fab (n-1) + fab (n-2)) 在 Haskell 中,| 被用于定义函数的多重条件分支。它可以用来在函数定义中指定多个条件,并根据不同的条件执行不同的代码。它的基本语法形式如下: 12345functionName pattern1 | condition1 = codeBlock1 ...