操作系统基础
C语言基础乘法逆元信息安全算法基础操作系统基础x86汇编基础信息论与编码 前言 这是电子科技大学计算机系的操作系统课程的总结,笔者已经基本理解这篇文章里的内容,但是如果有不准确之处,恳请指出。在操作系统这个成熟很久的领域中,有不少作者图文并茂的介绍了操作系统地基本知识。但是,笔者认为这里地总结相对精简,直接抵达核心概念,也是阅读学习的好资料。本文很多的总结和图片都来自老师的 PPT,笔者只是学习并且结合其他资料与自己的理解,加以阐释。 进程和线程 进程是操作系统最核心的概念,简单的说是正在运行的程序的抽象。进程的执行模型可以分成两类,顺序执行和并行执行,前者效率低,后者硬件要求高。我们整个课程都是只考虑并发执行,也就是微观上顺序执行,宏观上并行执行。进程=进程控制块+程序+相关数据,进程之间各自独立、不可预知速度地并发执行。 进程的状态 进程有三种基本状态,进程都在内存中: **就绪状态:**进程已分配到除 CPU 以外的所有必要资源后,只要再获得 CPU,便可立即执行。 **执行状态:**进程已获得...
JayPeggers 攻击分析
UTU 2022 年 12 月 29 日 5 时(北京时间 13 时),以太坊主网上的 JayPeggers 协议遭到重入攻击,损失约 15 ETH。随后攻击者通过 Tornado.Cash 和 Aztec...
(九)体验静态分析工具
(一)初识软件分析(二)数据流分析基础(三)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...