Lesson 0 of UEFI EDKII Learning Dev。
Topic:Legacy BIOS and UEFI
UEFI 组成与概念解释
American Fuzzy Lop 模糊测试器 README 翻译,AFL 是目前最广泛使用的模糊测试器之一,README 可以让我们较好的了解它的特性与限制。希望可以更出下一篇2333.
《Breaking the x86 ISA》 Christopher Domas 2017 论文笔记
记录一些常用的 hexo next 博客配置项
Set-UID 是两种常见特权程序之一,是 SEED Labs 软件安全部分的典型特权程序目标
1 | $ npm -v |
1 | $ brew uninstall --force node |
模糊测试是非常受欢迎的软件故障发现技术。基于覆盖率的模糊测试工具遇到的关键挑战是如何遍历程序的状态。一些模糊测试工具使用符号执行来解析路径约束,但是符号执行很慢且不能有效地解决多种约束。为了避免模糊测试额外计算量过高的问题,著名的 AFL 放弃了符号执行和任何其它重量级的程序分析技术。它触发程序以观察哪种输入可以发现新的分支状态,并保持这些输入作为之后输入变异的种子。AFL 在模糊测试程序时的额外消耗很低,但大多数变异出的输入都是无效输入(当不断变异却不能触发新状态的时候),因为 AFL 仅仅是盲目的随机变异输入而并没有利用程序的数据流信息。一类模糊测试工具优化 AFL 的方案是使用启发式算法来解决简单的预测问题,如“magic bytes”,但他们不能解决其它类型的路径约束。
AFL 是目前广受欢迎的基于输入变异的灰盒模糊测试工具。AFL 在编译阶段进行轻量级插桩,在变异时使用遗传算法自动发现更可能触发新内部状态的测试用例。作为基于覆盖率的模糊测试器,AFL 通过遍历不同的程序路径触发程序错误。
AFL 路径由一系列分支定义。在每次运行过程中,AFL 对每个分支执行了多少次计数。$(I_{prev},I_{cur})$代表一个分支,$I_{prev}$代表分支执行前的基本块ID,$I_{cur}$代表分支语句执行后的基本块ID。AFL 通过轻量级的插桩获取路径信息,其插桩方式为编译时在每个分支点前后注入。每次运行,AFL 分配一个路径跟踪表来对每个分支执行的次数计数,跟踪表的索引是 $hash(I_{prev}, I_{cur})$。
AFL 也在每次运行记录外,保持全局分支覆盖表,每项包含一个 8 位的响亮,记录这个分支在每次运行中执行的次数。b 向量表征一个范围,$b_0 … b_7$ 分别对应着[1],[2],[3],[4,7],[8,15],[16,31],[32,127],[128,$\Inf$]。例如,$b_3$ 被置位,代表该分支被执行了 4 到 7 次。
AFL 通过比较路径追踪表和分支覆盖表,来确定新的输入是否触发了新的内部状态。其两个判定条件是:
BIOS chip 是主板的芯片组的一块芯片,主要有两个值得关注的性质:首先,它(或其中一部分)内存映射到处理器的地址空间,使得处理器可以用和访问内存同样的方式访问 BIOS chip。CPU通过将指令指针指向 BIOS chip 中的代码,执行。其次,BIOS chip 存储了 CPU 上电后最先执行的指令。一个典型的 BIOS 包含 flash 描述符(BIOS chip 的内容表)、BIOS 区(被执行的第一条指令)、Intel ME(Management Engine)和以太网口。BIOS chip 在系统的多个部分间共享,而非在为 CPU 独占。
现代 Intel 芯片含有 Intel Management Engine。一旦上电,先启动 Intel ME。它执行自身的初始化:
按下电源键后,CPU 启动。在多核系统中,往往先启动一个 CPU(Bootstrap Processor a.k.a BSP)。刚启动时,CPU 进入 16-bit 实模式,指令指针指向 0xffff:0000(CS:IP的复位向量)。
0xf_fff0 作为 CPU 复位地址,指向 boot ROM 的 BIOS 区。BIOS 区中的固件被称为启动固件,例如 UEFI 实现,legacy 实现。
启动固件要做的第一件事是切换到保护模式,,开启分段并区分分段权限。然而启动固件仅包含一个段,被称为 flat mode。
在开始时,DRAM 还不可用。DRAM 初始化是启动固件的一个主要目标。但是在初始化 DRAM 前需要做些准备。
给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。
示例 1:
输入: [1,2,3,4,5,6,7] 和 k = 3
输出: [5,6,7,1,2,3,4]
解释:
向右旋转 1 步: [7,1,2,3,4,5,6]
向右旋转 2 步: [6,7,1,2,3,4,5]
向右旋转 3 步: [5,6,7,1,2,3,4]
示例 2:
输入: [-1,-100,3,99] 和 k = 2
输出: [3,99,-1,-100]
解释:
向右旋转 1 步: [99,-1,-100,3]
向右旋转 2 步: [3,99,-1,-100]
说明:
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/rotate-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。