Haskell(三) Monad
Haskell(一)入门Haskell(二)函数式编程Haskell(三) MonadHaskell(四)总结和工具链Haskell(五) 总结和展望Haskell(六) Project Euler 练习1-26 前言 我并不是相关数学理论研究者,而是 Haskell 和 Program language 的爱好者,研究水平还比较低,所以理解有错误是可能发生的,非常欢迎交流和指正。文章中引用了其他博客,我都已经明确注明来源和附带链接,如果您是这些博客的作者,也不同意被引用,那么请联系我。本文借用了 GPT4 写作,提供了非常多的指导。AI 正在改变学习的方式。 另外,我希望读者有一定的近世代数基础,也有一定的编程范式的理解,比如函数式语言(FP),特别是代码讲解都是基于 Haskell。由于我并没有实际的 Haskell 开发经验,所以我不熟悉 Monad的实际应用和用法,这篇文章只是给一个 demo,用于了解编程中的 Monad 的概念。 最后,对于 PL 和 software analysis...
x86汇编基础
C语言基础乘法逆元信息安全算法基础操作系统基础x86汇编基础信息论与编码 这是电子科技大学的汇编程序设计的课程复习,由本人总结,主要资源来自 PPT 和自编教材,少部分辅以网上的博客(会给出参考链接)。课程是基于 x86 汇编,汇编语法和汇编器采用 MASM,程序主要是 flat 模式,语法可能和其他的汇编器不同。这篇文章的主要目的是总结和复习,所以可能较为简洁,读者可以在评论区提问,我会不断完善。如果由不准确或者错误的地方,欢迎指正。 微处理器和寄存器简介 由于汇编需要程序员考虑处理器和寄存器的状态,因此了解基本的内容,有利于理解汇编是如何在 CPU 上工作的。汇编语言与机器语言(字节码)是绑定的,大部分指令直接对应 CPU 的指令,因此汇编不具有可移植性,无法在不同的指令架构下运行。 CPU 执行指令 我们学习 CPU,主要是关注 CPU 内的寄存器、访存方式、输入输出。在计算机组成原理中,我们已经学习过 CPU 的概念图,每次运行: 取指令(Instruction Fetch):CPU 发送读取内存的地址,获取指令代码,然后将指令保存在指令寄存器 IR...
操作系统基础
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...